Выяўленне паўтаральных запісаў і абнаўляць іх з ідэнтыфікатарам першага ўваходжання

У мяне ёсць табліца накшталт гэтага.

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

Тое, што я хачу зрабіць, гэта:

  • Для запісу з першым з'яўленнем «Name», я хачу, каб абнавіць «Source Id» са значэннем «Id»
  • Для запісаў з ДРУГІМ і ПОДРЯД ўваходжанне «Name», я хачу, каб абнавіць «Source Id» са значэннем «Id» першага ўваходжання

Такім чынам, табліца павінна быць абноўлена наступным чынам:

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, а) ...

Дзякуй!

1
Якая версія Oracle? Аналітычная падтрымка пачынаецца ў 9i. А што вы спрабавалі выкарыстоўваць?
дададзена аўтар OMG Ponies, крыніца
Гэта добра. А што вы спрабавалі да гэтага часу?
дададзена аўтар Adrian Carneiro, крыніца

3 адказы

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

Проста выкарыстоўвайце подзапросов, якая выводзіць мін ідэнтыфікатар для аднаго імя.

1
дададзена

Так як 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
дададзена

Нешта падобнае павінна атрымаць, што вы хочаце:

update table a
set source_id = (
    select min(id)
    from table b
    where b.name = a.name
);
1
дададзена
Ці ёсць псеўданімы падтрымкі Oracle на UPDATE <table> псеўданім?
дададзена аўтар sll, крыніца
Да .. гэта зацвярджэнне будзе працаваць на Oracle
дададзена аўтар Craig, крыніца