Oracle
 sql >> Base de données >  >> RDS >> Oracle

Mise à jour en utilisant Join(s) - Multi DB/Table

Je suppose que lorsque vous posez à nouveau la question, vous voulez une syntaxe qui fonctionnera à la fois sur Oracle et SQL Server, même si cela n'affectera inévitablement qu'une seule table.

Le code standard SQL-92 d'entrée de gamme est pris en charge par les deux plates-formes. Par conséquent, le code SQL-92 de "sous-requêtes scalaires" suivant devrait fonctionner :

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

Notez que lors de l'utilisation du nom de corrélation t1 pour Ttble1 est une syntaxe valide selon la norme SQL-92 cela matérialisera une table et le UPDATE ciblera alors la table matérialisée 't1' et laissera votre table de base 'table1' inchangée, ce qui, je suppose, n'est pas l'effet souhaité. Bien que je sois à peu près sûr qu'Oracle et SQL Server ne sont pas conformes à cet égard et que, dans la pratique, cela fonctionnerait comme prévu, il n'y a aucun mal à être ultra prudent et à s'en tenir à la syntaxe SQL-92 en qualifiant entièrement la table cible.

Les gens ont tendance à ne pas aimer le code "répété" dans les sous-requêtes ci-dessus (même si l'optimiseur doit être assez intelligent pour ne l'évaluer qu'une seule fois).

Les versions les plus récentes d'Oracle et de SQL Server prennent en charge la norme SQL :2003 MERGE syntaxe, serait peut-être capable d'utiliser quelque chose de proche de ceci :

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;

Je viens de remarquer que votre exemple est encore plus simple que je ne le pensais au départ et nécessite simplement une simple sous-requête qui devrait s'exécuter sur la plupart des produits SQL, par exemple.

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