Jag antar att när du ställde om frågan vill du ha syntax som fungerar på både Oracle och SQL Server även om det oundvikligen bara kommer att påverka en tabell.
Ingångsnivå SQL-92 Standardkod stöds av båda plattformarna, därför bör följande "skalära underfrågor" SQL-92-kod fungera:
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
);
Observera att när du använder korrelationsnamnet t1
för Ttble1
är giltig syntax enligt SQL-92 Standard kommer detta att materialisera en tabell och UPDATE
kommer då att rikta in sig på den materialiserade tabellen 't1' och lämna din bastabell 'tabell1' opåverkad, vilket jag antar inte är den önskade effekten. Även om jag är ganska säker på att både Oracle och SQL Server inte är kompatibla i detta avseende och att det i praktiken skulle fungera som förväntat, är det ingen skada att vara extremt försiktig och hålla sig till SQL-92-syntaxen genom att helt kvalificera måltabellen.
Folk brukar inte gilla den "upprepade" koden i ovanstående underfrågor (även om optimeraren borde vara smart nog att utvärdera den bara en gång).
Nyare versioner av Oracle och SQL Server stöder båda standard SQL:2003 MERGE
syntax, skulle kanske kunna använda något i närheten av detta:
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;
Jag märkte precis att ditt exempel är ännu enklare än jag först trodde och bara kräver en enkel underfråga som bör köras på de flesta SQL-produkter, t.ex.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);