Көшірме жазбаларды анықтап, оларды бірінші рет идентификаторымен жаңартыңыз

Менің осындай үстелім бар.

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

Мен не істегім келеді:

  • FIRST пайда болған жазбалар үшін «Аты» «Меню идентификаторын» «Id» мәнімен жаңартқым келеді
  • Екінші және CONSECUTIVE «Аты» жазбалары бар жазбалар үшін «Source ID» мәнін «FIRST» оқиғасының «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 мәні autoincrement мәні өсіп келе жатқандықтан (бірінші?) 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> alias-дегі бүркеншік аттарын қолдайды ма?
қосылды автор sll, көзі
Иә, бұл мәлімдеме Oracle-да жұмыс істейді
қосылды автор Craig, көзі