Ich nehme an, wenn Sie die Frage erneut gestellt haben, möchten Sie eine Syntax, die sowohl auf Oracle als auch auf SQL Server funktioniert, obwohl sie zwangsläufig nur eine Tabelle betrifft.
SQL-92-Standardcode der Einstiegsebene wird von beiden Plattformen unterstützt, daher sollte der folgende skalare Unterabfragen-SQL-92-Code funktionieren:
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
);
Beachten Sie, dass bei Verwendung des Korrelationsnamens t1
für Ttble1
Ist eine gültige Syntax nach dem SQL-92-Standard, so wird eine Tabelle und das UPDATE
materialisiert wird dann auf die materialisierte Tabelle 't1' abzielen und Ihre Basistabelle 'table1' unberührt lassen, was meiner Meinung nach nicht der gewünschte Effekt ist. Obwohl ich ziemlich sicher bin, dass sowohl Oracle als auch SQL Server in dieser Hinsicht nicht konform sind und dass dies in der Praxis wie erwartet funktionieren würde, schadet es nicht, äußerst vorsichtig zu sein und sich an die SQL-92-Syntax zu halten, indem die Zieltabelle vollständig qualifiziert wird.
Die Leute neigen dazu, den 'wiederholten' Code in den obigen Unterabfragen nicht zu mögen (obwohl der Optimierer schlau genug sein sollte, ihn nur einmal auszuwerten).
Neuere Versionen von Oracle und SQL Server unterstützen beide den Standard SQL:2003 MERGE
Syntax, könnte etwas Ähnliches verwenden:
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;
Mir ist gerade aufgefallen, dass Ihr Beispiel noch einfacher ist, als ich zuerst dachte, und lediglich eine einfache Unterabfrage erfordert, die auf den meisten SQL-Produkten ausgeführt werden sollte, z.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);