В таблице, в которой я имею дело, есть несколько строк, которые имеют одинаковые значения для 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
(primary) одному из них и флаг 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
вдохновленным этим сообщением, и это визуальное описание. С этим я могу назначить один и тот же флаг всем дубликатам.
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
должен работать с более двух дубликатов. Марк Харрисон также предполагает, что вы присоединяетесь к колонкам без дубликатов в начале своего сообщения, которые звучат так, как будто это не очень хорошая идея.
Я использую MySQL, если это интересно.