Předpokládám, že když jste znovu položili otázku, chcete syntaxi, která bude fungovat na Oracle i SQL Server, i když to nevyhnutelně ovlivní pouze jednu tabulku.
Standardní kód SQL-92 vstupní úrovně je podporován oběma platformami, proto by měl fungovat následující kód SQL-92 pro „skalární poddotazy“:
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
);
Všimněte si, že při použití názvu korelace t1
pro Ttble1
je platná syntaxe podle standardu SQL-92, tím se zhmotní tabulka a UPDATE
poté zacílí na materializovanou tabulku 't1' a ponechá vaši základní tabulku 'table1' nedotčenou, což předpokládám není požadovaný účinek. I když jsem si docela jistý, že Oracle i SQL Server v tomto ohledu nevyhovují a že by v praxi fungovaly podle očekávání, není na škodu být velmi opatrný a držet se syntaxe SQL-92 a plně kvalifikovat cílovou tabulku.
Lidem se obvykle nelíbí „opakovaný“ kód ve výše uvedených poddotazech (i když by měl být optimalizátor dostatečně chytrý, aby jej vyhodnotil pouze jednou).
Novější verze Oracle a SQL Server podporují obě standardní SQL:2003 MERGE
syntaxe, by mohl být schopen použít něco podobného:
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;
Právě jsem si všiml, že váš příklad je ještě jednodušší, než jsem si původně myslel, a vyžaduje pouze jednoduchý poddotaz, který by měl běžet na většině produktů SQL, např.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);