Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Update mit Join(s) - Multi DB/Table

Ich nehme an, wenn Sie die Frage erneut gestellt haben, möchten Sie eine Syntax, die sowohl auf Oracle als auch auf SQL Server funktioniert, obwohl sie zwangsläufig nur eine Tabelle betrifft.

SQL-92-Standardcode der Einstiegsebene wird von beiden Plattformen unterstützt, daher sollte der folgende skalare Unterabfragen-SQL-92-Code funktionieren:

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
                  );

Beachten Sie, dass bei Verwendung des Korrelationsnamens t1 für Ttble1 Ist eine gültige Syntax nach dem SQL-92-Standard, so wird eine Tabelle und das UPDATE materialisiert wird dann auf die materialisierte Tabelle 't1' abzielen und Ihre Basistabelle 'table1' unberührt lassen, was meiner Meinung nach nicht der gewünschte Effekt ist. Obwohl ich ziemlich sicher bin, dass sowohl Oracle als auch SQL Server in dieser Hinsicht nicht konform sind und dass dies in der Praxis wie erwartet funktionieren würde, schadet es nicht, äußerst vorsichtig zu sein und sich an die SQL-92-Syntax zu halten, indem die Zieltabelle vollständig qualifiziert wird.

Die Leute neigen dazu, den 'wiederholten' Code in den obigen Unterabfragen nicht zu mögen (obwohl der Optimierer schlau genug sein sollte, ihn nur einmal auszuwerten).

Neuere Versionen von Oracle und SQL Server unterstützen beide den Standard SQL:2003 MERGE Syntax, könnte etwas Ähnliches verwenden:

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;

Mir ist gerade aufgefallen, dass Ihr Beispiel noch einfacher ist, als ich zuerst dachte, und lediglich eine einfache Unterabfrage erfordert, die auf den meisten SQL-Produkten ausgeführt werden sollte, z.

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