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