sql >> Databasteknik >  >> RDS >> Oracle

Uppdatera med Join(s) - Multi DB/Table

Jag antar att när du ställde om frågan vill du ha syntax som fungerar på både Oracle och SQL Server även om det oundvikligen bara kommer att påverka en tabell.

Ingångsnivå SQL-92 Standardkod stöds av båda plattformarna, därför bör följande "skalära underfrågor" SQL-92-kod fungera:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

Observera att när du använder korrelationsnamnet t1 för Ttble1 är giltig syntax enligt SQL-92 Standard kommer detta att materialisera en tabell och UPDATE kommer då att rikta in sig på den materialiserade tabellen 't1' och lämna din bastabell 'tabell1' opåverkad, vilket jag antar inte är den önskade effekten. Även om jag är ganska säker på att både Oracle och SQL Server inte är kompatibla i detta avseende och att det i praktiken skulle fungera som förväntat, är det ingen skada att vara extremt försiktig och hålla sig till SQL-92-syntaxen genom att helt kvalificera måltabellen.

Folk brukar inte gilla den "upprepade" koden i ovanstående underfrågor (även om optimeraren borde vara smart nog att utvärdera den bara en gång).

Nyare versioner av Oracle och SQL Server stöder båda standard SQL:2003 MERGE syntax, skulle kanske kunna använda något i närheten av detta:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

Jag märkte precis att ditt exempel är ännu enklare än jag först trodde och bara kräver en enkel underfråga som bör köras på de flesta SQL-produkter, t.ex.

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );


  1. Hur kan jag konvertera villkorlig aggregering mysql till laravel-fråga?

  2. Rails 4 session.id ibland noll

  3. MySQL:Begränsande antal mottagna resultat baserat på ett kolumnvärde | Kombinera frågor

  4. Hur kan jag konvertera datetime till datum, trunkera tiderna, lämna mig datumen?