Jeg går ud fra, at når du stillede spørgsmålet igen, vil du have syntaks, der vil fungere på både Oracle og SQL Server, selvom det uundgåeligt kun vil påvirke én tabel.
Entry level SQL-92 Standard-kode understøttes af begge platforme, derfor burde følgende 'skalære underforespørgsler' SQL-92-kode fungere:
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
);
Bemærk, at mens du bruger korrelationsnavnet t1
for Ttble1
er gyldig syntaks i henhold til SQL-92 Standard, vil dette materialisere en tabel og UPDATE
vil derefter målrette den materialiserede tabel 't1' og lade din basistabel 'table1' være upåvirket, hvilket jeg antager ikke er den ønskede effekt. Selvom jeg er ret sikker på, at både Oracle og SQL Server ikke er kompatible i denne henseende, og at det i praksis ville fungere som forventet, er der ingen skade i at være ultra forsigtig og holde sig til SQL-92-syntaksen ved fuldt ud at kvalificere måltabellen.
Folk har en tendens til ikke at kunne lide den 'gentagne' kode i ovenstående underforespørgsler (selvom optimeringsværktøjet burde være smart nok til kun at evaluere det én gang).
Nyere versioner af Oracle og SQL Server understøtter begge Standard SQL:2003 MERGE
syntaks, ville måske være i stand til at bruge noget nær dette:
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;
Jeg har lige bemærket, at dit eksempel er endnu enklere, end jeg først troede og blot kræver en simpel underforespørgsel, der burde køre på de fleste SQL-produkter, f.eks.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);