sql >> Databáze >  >> RDS >> Oracle

Aktualizace pomocí Join(s) - Multi DB/Table

Předpokládám, že když jste znovu položili otázku, chcete syntaxi, která bude fungovat na Oracle i SQL Server, i když to nevyhnutelně ovlivní pouze jednu tabulku.

Standardní kód SQL-92 vstupní úrovně je podporován oběma platformami, proto by měl fungovat následující kód SQL-92 pro „skalární poddotazy“:

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

Všimněte si, že při použití názvu korelace t1 pro Ttble1 je platná syntaxe podle standardu SQL-92, tím se zhmotní tabulka a UPDATE poté zacílí na materializovanou tabulku 't1' a ponechá vaši základní tabulku 'table1' nedotčenou, což předpokládám není požadovaný účinek. I když jsem si docela jistý, že Oracle i SQL Server v tomto ohledu nevyhovují a že by v praxi fungovaly podle očekávání, není na škodu být velmi opatrný a držet se syntaxe SQL-92 a plně kvalifikovat cílovou tabulku.

Lidem se obvykle nelíbí „opakovaný“ kód ve výše uvedených poddotazech (i když by měl být optimalizátor dostatečně chytrý, aby jej vyhodnotil pouze jednou).

Novější verze Oracle a SQL Server podporují obě standardní SQL:2003 MERGE syntaxe, by mohl být schopen použít něco podobného:

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;

Právě jsem si všiml, že váš příklad je ještě jednodušší, než jsem si původně myslel, a vyžaduje pouze jednoduchý poddotaz, který by měl běžet na většině produktů SQL, např.

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


  1. Jak vložit vybrané sloupce ze souboru CSV do databáze MySQL pomocí LOAD DATA INFILE

  2. Připojovací řetězec PostgreSQL s ovladačem ODBC v C#, klíčové slovo není podporováno:ovladač

  3. <SQL>Jak změnit velikost VARCHAR2 tabulky

  4. Ora SQL Query:spojení bez referencí