Таблица, с которой я имею дело, имеет несколько строк, которые имеют одинаковые значения для lat
и lon
. Пример показывает, что 1
, 3
, 5
имеют одинаковое расположение, но атрибут name
отличается. hash
построен от name
, lat
и lon
и отличается поэтому.Как обновить несколько дубликатов с разными значениями в одной таблице?
BEFORE:
id | name | lat | lon | flag | hash
----+------+-----+-----+------+------
1 | aaa | 16 | 48 | 0 | 2cd <-- duplicate
2 | bbb | 10 | 22 | 0 | 3fc
3 | ccc | 16 | 48 | 0 | 8ba <-- duplicate
4 | ddd | 10 | 23 | 0 | c33
5 | eee | 16 | 48 | 0 | 751 <-- duplicate
мне нужно определить «дубликаты» в этой таблице и хочет присвоить флаг 1
(первичная) к одному из них и флаг 2
(вторичного) к другим. Не важно, какой «дубликат» помечен как первичный.
AFTER:
id | name | lat | lon | flag | hash
----+------+-----+-----+------+------
1 | aaa | 16 | 48 | 1 | 2cd <-- updated
2 | bbb | 10 | 22 | 0 | 3fc
3 | ccc | 16 | 48 | 2 | 8ba <-- updated
4 | ddd | 10 | 23 | 0 | c33
5 | eee | 16 | 48 | 2 | 751 <-- updated
Я начал экспериментировать с INNER JOIN
inspired by this post и этот visual description. С этим я могу назначить один и тот же флаг всем дубликатам.
UPDATE table t1
INNER JOIN table_name t2
ON
t1.lat = t2.lat
AND t1.lon = t2.lon
AND t1.hash != t2.hash
SET
t1.flag = 2;
Я также протестировали LEFT OUTER JOIN
с WHERE t2.id IS NULL
, которые могли бы работать, когда есть только две строки. Тем не менее, я не могу думать, как JOIN
должен работать с более двух дубликатов. Марк Харрисон также предполагает «что вы присоединяетесь к столбцам без дубликатов»at the beginning of his post, которые звучат так, как будто это не очень хорошая идея.
Я использую MySQL, если это представляет интерес.
Работает очень быстро! Спасибо. Хотя, * SQL Fiddle * не загружается для меня (ни [пример] (http://sqlfiddle.com/#viewSample)). – JJD