Определите дубликаты записей и обновите их с помощью идентификатора первого появления - PullRequest
1 голос
/ 28 октября 2011

У меня есть такая таблица.

ID  Name      Source ID
1   Orange       0
2   Pear         0
3   Apple        0
4   Orange       0
5   Apple        0
6   Banana       0
7   Orange       0

Что я хочу сделать:

  • Для записей с ПЕРВЫМ вхождением «Имя», я хочу обновить«Идентификатор источника» со значением «Идентификатор»
  • Для записей с ВТОРОМ и ПОСТОЯННЫМ вхождениями «Имя» я хочу обновить «Идентификатор источника» значением «Идентификатор» ПЕРВОГО вхождения

Итак, таблица должна быть обновлена ​​следующим образом:

ID  Name      Source ID
1   Orange       1
2   Pear         2
3   Apple        3
4   Orange       1
5   Apple        3
6   Banana       6
7   Orange       1

Как я могу сделать это в SQL (Oracle, в частности, но я в порядке с General SQL какхорошо) ...

Спасибо!

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Поскольку ID растет значение автоинкремента (верно?) FirstID можно рассчитать как MIN(ID):

UPDATE fruits
  SET SourceID = ag.ID
FROM fruits f 
INNER JOIN
(
  SELECT MIN(ID) as ID, Name FROM @fruits
  GROUP BY Name
) ag 
ON ag.Name = f.Name
1 голос
/ 28 октября 2011

Примерно так должно получиться то, что вы хотите:

update table a
set source_id = (
    select min(id)
    from table b
    where b.name = a.name
);
1 голос
/ 28 октября 2011
UPDATE MyTable
SET SourceID = Sub.ID
FROM MyTable 
INNER JOIN (SELECT MIN(ID) as ID, Name FROM MyTable GROUP BY Name) Sub
    ON Sub.Name = MyTable.Name

Просто используйте подзапрос, в котором указан минимальный идентификатор для имени.

...