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

Aggiorna usando Join(s) - Multi DB/Table

Presumo che quando hai posto nuovamente la domanda, desideri una sintassi che funzioni sia su Oracle che su SQL Server anche se inevitabilmente influirà su una sola tabella.

Il codice standard SQL-92 entry level è supportato da entrambe le piattaforme, pertanto il seguente codice SQL-92 "scalar subquery" dovrebbe funzionare:

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

Si noti che durante l'utilizzo del nome di correlazione t1 per Ttble1 è sintassi valida secondo lo standard SQL-92 questo materializzerà una tabella e il UPDATE punterà quindi alla tabella materializzata 't1' e lascerà inalterata la tabella di base 'table1', che presumo non sia l'effetto desiderato. Anche se sono abbastanza sicuro che sia Oracle che SQL Server non siano conformi a questo riguardo e che in pratica funzionerebbero come previsto, non c'è nulla di male nell'essere estremamente cauti e attenersi alla sintassi SQL-92 qualificando completamente la tabella di destinazione.

La gente tende a non apprezzare il codice "ripetuto" nelle sottoquery precedenti (anche se l'ottimizzatore dovrebbe essere abbastanza intelligente da valutarlo solo una volta).

Le versioni più recenti di Oracle e SQL Server supportano entrambe lo standard SQL:2003 MERGE sintassi, potrebbe essere in grado di utilizzare qualcosa di simile a questo:

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;

Ho appena notato che il tuo esempio è ancora più semplice di quanto pensassi all'inizio e richiede semplicemente una semplice sottoquery che dovrebbe essere eseguita sulla maggior parte dei prodotti SQL, ad es.

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