Задача решена!
Обновить:
Не совсем правильно, что мне нужно, давайте пример на простой таблице с идентификаторами полей, NAME, COVER
У меня есть 100 записей с 100 именами, некоторые из них дублируются, но я хочу только сначала обновить их из дубликатов.
Попытка обновить все 1-ю строки из всех дубликатов в базе данных, действительно трудно сделать это, любая идея, как я могу это сделать? Ниже приведен код, который я пытаюсь перестроить, но этот код заменяет каждый первый на последний для всех дубликатов.
Схема, как я хочу, чтобы она работала ниже
ID NAME COVER 1 Max 1 2 Max 0 3 Andy 1 4 Andy 0 5 Andy 0 UPDATE table t JOIN ( SELECT MinID, b.Name LatestName FROM table b JOIN ( SELECT MIN(ID) MinID, MAX(ID) MaxID FROM table GROUP BY tag HAVING COUNT(*) > 1 ) g ON b.ID = g.MaxID ) rs ON t.ID = rs.MinID SET t.Name = LatestName;
Не совсем ясно, чего вы хотите. Возможно, это:
UPDATE table AS t JOIN ( SELECT MIN(ID) MinID FROM table GROUP BY Name HAVING COUNT(*) > 1 ) AS m ON t.ID = m.MinID SET t.Cover = 1 ;
Для этого (и будущего) вопроса, имейте в виду, когда вы пишете вопрос:
1. a description of your problem, as clear as possible --- you have that 2. data you have now (a few rows of the tables) --- ok, nice 3. the code you have tried --- yeah, but better use same names --- as the data and description above 4. the error you get (if you get an error) --- doesn't apply here 5. the result you want (the rows after the update in your case) --- so we know what you mean in case we --- haven't understood from all the rest
Использовать подзапрос в качестве критерия выбора:
UPDATE table t SET t.Name = LatestName WHERE ID = (SELECT ID FROM table WHERE ( SELECT COUNT(DISTINCT(Name)) FROM table WHERE Name = 'duplicate' ) > 1 LIMIT 1)
Я сделал это недавно в PostgreSQL. Вы можете использовать временную таблицу? Если это так, для каждого набора дубликатов вставьте первичный ключ MIN () в вашу временную таблицу, а затем выполните UPDATE, используя предложение where, используя PK в таблице temp.
Изменить: после вашего комментария, вот что я сделал недавно.
CREATE TEMPORARY TABLE misc_updates ( temp_oid INTEGER, job INTEGER, run CHARACTER VARYING(8), quantity INTEGER ); INSERT INTO misc_updates (temp_oid, job, run, quantity) SELECT MAX(runjob.oid) temp_oid, runjob.job, runjob.run, SUM(runjob.quantity) sum_quantity FROM runjob INNER JOIN job ON (runjob.job = job.code) INNER JOIN (SELECT run, job FROM runjob GROUP BY run, job HAVING COUNT(*) > 1) my_inner ON (runjob.run = my_inner.run AND runjob.job = my_inner.job) GROUP BY runjob.job, runjob.run, job.quantity ; /* Do updates on one of the duplicated runjob rows */ UPDATE runjob SET quantity = mu.quantity FROM misc_updates mu WHERE runjob.oid = mu.temp_oid;
Вы можете поменять «oid» на ваш первичный ключ (моя проблема заключалась в том, что в таблице не было первичного ключа!). Также критическим является предложение where в UPDATE, поэтому обновляются только некоторые строки. Вам нужно будет поменять MAX () на MIN () и, конечно, изменить строки на те, которые используются в вашем прецеденте. Имейте в виду, что это для PostgreSQL, но подход должен быть одинаков.