sql >> Database >  >> RDS >> Oracle

Update met behulp van Join(s) - Multi DB/Table

Ik neem aan dat wanneer je de vraag opnieuw stelt, je een syntaxis wilt die zowel op Oracle als op SQL Server werkt, ook al zal het onvermijdelijk slechts één tabel beïnvloeden.

SQL-92 standaardcode op instapniveau wordt door beide platforms ondersteund, daarom zou de volgende SQL-92-code met 'scalaire subquery's' moeten werken:

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

Merk op dat tijdens het gebruik van de correlatienaam t1 voor Ttble1 is geldige syntaxis volgens de SQL-92-standaard dit zal een tabel opleveren en de UPDATE zal dan de gematerialiseerde tabel 't1' targeten en uw basistabel 'table1' onaangetast laten, waarvan ik aanneem dat dit niet het gewenste effect is. Hoewel ik er vrij zeker van ben dat zowel Oracle als SQL Server in dit opzicht niet-compliant zijn en dat het in de praktijk zou werken zoals verwacht, kan het geen kwaad om uiterst voorzichtig te zijn en vast te houden aan de SQL-92-syntaxis door de doeltabel volledig te kwalificeren.

Mensen hebben de neiging om de 'herhaalde' code in de bovenstaande subquery's niet leuk te vinden (ook al zou de optimizer slim genoeg moeten zijn om deze maar één keer te evalueren).

Recentere versies van Oracle en SQL Server ondersteunen beide Standard SQL:2003 MERGE syntaxis, zou mogelijk iets in de buurt hiervan kunnen gebruiken:

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;

Ik heb zojuist gemerkt dat uw voorbeeld nog eenvoudiger is dan ik eerst dacht en slechts een eenvoudige subquery vereist die op de meeste SQL-producten zou moeten worden uitgevoerd, b.v.

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


  1. Hoe maak je meerdere WHERE IN-kolomquery's in de Doctrine-querybuilder?

  2. Hoe test ik of een kolom gelijk is aan empty_clob() in Oracle?

  3. JDBC MySQL-verbinding met Unix Socket

  4. Postgresql:Hoe selecteer ik de top n procent (%) items uit elke groep/categorie