Werk rijen in de ene tabel bij met gegevens uit een andere tabel op basis van een kolom in elke kolom die gelijk is

Update veel rijen in één tabel vanuit een andere tabel op basis van één kolom in elk die gelijk is (user_id).

beide tabellen hebben een kolom user_id . Moet gegevens uit t2 invoegen in t1 wanneer de kolom user_id gelijk is.

Bij voorbaat dank voor alle geboden hulp.

37
Upvoted. Zie gerelateerde vraag: stackoverflow.com/q/7030699/435605
toegevoegd de auteur AlikElzin-kilaka, de bron

5 antwoord

update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2
      ) = (
    select
      t2.column1, 
      t2.column2
    from
      table2  t2
    where
      t2.column1 = t1.column1
     )
    where exists (
      select 
        null
      from 
        table2 t2
      where 
        t2.column1 = t1.column1
      );

Or this (if t2.column1 <=> t1.column1 are many to one and anyone of them is good):

update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2
      ) = (
    select
      t2.column1, 
      t2.column2
    from
      table2  t2
    where
      t2.column1 = t1.column1
    and
      rownum = 1    
     )
    where exists (
      select 
        null
      from 
        table2 t2
      where 
        t2.column1 = t1.column1
      ); 
50
toegevoegd
Met dit antwoord worden meer rijen bijgewerkt dan nodig. Een extra waar nodig is. Zie antwoord van Tony Andrews.
toegevoegd de auteur AlikElzin-kilaka, de bron
@ AlikElzin-kilaka, gecorrigeerd, bedankt voor het wijzen op de fout!
toegevoegd de auteur Dimitre Radoulov, de bron
@JohnRose, graag gedaan!
toegevoegd de auteur Dimitre Radoulov, de bron
Er zijn elders in SO nog veel andere antwoorden, maar dit is de enige die voor mij heeft gewerkt en het heeft mijn spaartje bespaard. Dank je!
toegevoegd de auteur Ian, de bron
Dank u zeer. Werkt als een charme nadat gegevens zijn gecorrigeerd om duplicaten te elimineren !!!
toegevoegd de auteur JcR49, de bron
Dit antwoord is correct en zeer nuttig. Dank je.
toegevoegd de auteur JcR49, de bron

Als u overeenkomende rijen in t1 met gegevens van t2 wilt bijwerken, gaat u als volgt te werk:

update t1
set (c1, c2, c3) = 
(select c1, c2, c3 from t2
 where t2.user_id = t1.user_id)
where exists
(select * from t2
 where t2.user_id = t1.user_id)

Het "where exists" -onderdeel voorkomt dat de t1-kolommen worden bijgewerkt als ze null zijn als er geen match bestaat.

25
toegevoegd
Upvoted. Zie vergelijkbaar antwoord: stackoverflow.com/a/7031405/435605
toegevoegd de auteur AlikElzin-kilaka, de bron
Dit heeft me geholpen, bedankt!
toegevoegd de auteur AndeeC, de bron
Dus user_id is niet uniek in t1? Hoe weet je in dat geval welke t1 waar de waarden vandaan komen?
toegevoegd de auteur Tony Andrews, de bron
De "enkele rij-query retourneert veel rijen" fout betekent dat voor sommige user_id er 2 (of meer) rijen in t2 zijn. Dus je laatste opmerking was fout of je database is beschadigd!
toegevoegd de auteur Tony Andrews, de bron
De Where Exists is een belangrijk onderdeel, vooral als u een update uitvoert vanuit een kleinere tabel die slechts een subset van de gegevens bevat in een veel grotere tabel. Aanzienlijke snelheidsboost.
toegevoegd de auteur AnthonyVO, de bron
Ik weet niet zeker of ik dit correct werk ... Dit antwoord is correct en zeer nuttig. Dank je.
toegevoegd de auteur JcR49, de bron
Dank je. Werkt prima.
toegevoegd de auteur JcR49, de bron
Bedankt ..... Zou er maar één moeten zijn ... Ik had moeten zeggen dat ik er voorzichtiger op zal letten. Ik waardeer de hulp.
toegevoegd de auteur JcR49, de bron
Ja, er is er slechts één gebruiker_id. Beide tabellen hebben één kolom van user_id en hebben overeenkomende ingangen, maar er is slechts één user_id, per gebruiker ....
toegevoegd de auteur JcR49, de bron
Er zijn bijna duizend rijen die moeten worden bijgewerkt .......
toegevoegd de auteur JcR49, de bron
Dank je. Net als andere query's die ik heb geprobeerd, retourneert dit 'een rij query rturns veel rijen'. Zal niets invoegen/bijwerken.
toegevoegd de auteur JcR49, de bron
merge into t2 t2 
using (select * from t1) t1
on (t2.user_id = t1.user_id)
when matched then update
set
   t2.c1 = t1.c1
,  t2.c2 = t1.c2
14
toegevoegd

Het is geen invoegsel als de record al bestaat in t1 (de gebruikers-ID komt overeen), tenzij u graag dubbele gebruikers-ID's maakt.

Wil je misschien een update?

UPDATE t1
   SET  = (SELECT 
                          FROM t2
                         WHERE t2.user_id = t1.user_id)
 WHERE EXISTS
      (SELECT 1
         FROM t2
        WHERE t1.user_id = t2.user_id);

Hoop dat het helpt...

5
toegevoegd
U krijgt een ORA-01427-fout als de relatie niet één-op-één is. Dat betekent dat uw equijoin-instructie niet één record in tabel één-op-één-record in tabel twee kan evenaren.
toegevoegd de auteur Nathan, de bron
ORA-01427: subquery met één rij retourneert meer dan één rij
toegevoegd de auteur JcR49, de bron
Ik kom steeds terug naar dezelfde ora 01427 query met één rij retourneert meer dan één rij.
toegevoegd de auteur JcR49, de bron

Je kon altijd het "when not matched section" gebruiken en weglaten

merge into table1 FromTable   
   using table2 ToTable
     on     ( FromTable.field1 = ToTable.field1
          and  FromTable.field2 =ToTable.field2)
when Matched then
update set 
  ToTable.fieldr = FromTable.fieldx,
  ToTable.fields = FromTable.fieldy, 
  ToTable.fieldt =  FromTable.fieldz)
when not matched then
  insert  (ToTable.field1,
       ToTable.field2,
       ToTable.fieldr,
       ToTable.fields,
       ToTable.fieldt)
  values (FromTable.field1,
         FromTable.field2,
         FromTable.fieldx,
         FromTable.fieldy,
         FromTable.fieldz);
2
toegevoegd