sql >> Database teknologi >  >> RDS >> Oracle

Opdater ved hjælp af Join(s) - Multi DB/Table

Jeg går ud fra, at når du stillede spørgsmålet igen, vil du have syntaks, der vil fungere på både Oracle og SQL Server, selvom det uundgåeligt kun vil påvirke én tabel.

Entry level SQL-92 Standard-kode understøttes af begge platforme, derfor burde følgende 'skalære underforespørgsler' SQL-92-kode fungere:

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

Bemærk, at mens du bruger korrelationsnavnet t1 for Ttble1 er gyldig syntaks i henhold til SQL-92 Standard, vil dette materialisere en tabel og UPDATE vil derefter målrette den materialiserede tabel 't1' og lade din basistabel 'table1' være upåvirket, hvilket jeg antager ikke er den ønskede effekt. Selvom jeg er ret sikker på, at både Oracle og SQL Server ikke er kompatible i denne henseende, og at det i praksis ville fungere som forventet, er der ingen skade i at være ultra forsigtig og holde sig til SQL-92-syntaksen ved fuldt ud at kvalificere måltabellen.

Folk har en tendens til ikke at kunne lide den 'gentagne' kode i ovenstående underforespørgsler (selvom optimeringsværktøjet burde være smart nok til kun at evaluere det én gang).

Nyere versioner af Oracle og SQL Server understøtter begge Standard SQL:2003 MERGE syntaks, ville måske være i stand til at bruge noget nær dette:

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;

Jeg har lige bemærket, at dit eksempel er endnu enklere, end jeg først troede og blot kræver en simpel underforespørgsel, der burde køre på de fleste SQL-produkter, f.eks.

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


  1. Hvordan får jeg næste måneds dato fra dags dato og indsætter den i min database?

  2. auto_increment efter gruppe

  3. Procedurer for Oracle i php med PDO

  4. SQL til opdatering Spring over låst forespørgsel og Java Multi Threading - Sådan løses dette