Я полагаю, что это стандартный SQL
На самом деле это не так. Стандартный SQL не имеет синтаксиса UPDATE..FROM
. Скорее, вам нужно использовать скалярный подзапрос для каждого предложения SET
плюс еще один для EXISTS
, чтобы стандартный синтаксис был еще более повторяющимся, например,
UPDATE customer
SET forenames = (
SELECT ot.forenames
FROM order_transaction AS ot
WHERE customer.custid = ot.custid
AND ot.trans_orderid = 5678
),
surname = (
SELECT CASE
WHEN ot.safeplace IS NULL
THEN 'test SAFEPLACE IS NULL'
ELSE 'test Safeplace IS NOT NULL'
END
FROM order_transaction AS ot
WHERE customer.custid = ot.custid
AND ot.trans_orderid = 5678
),
middlename = (
SELECT CASE
WHEN ot.safeplace IS NULL
THEN 'test SAFEPLACE IS NULL'
ELSE 'test Safeplace IS NOT NULL'
END
FROM order_transaction AS ot
WHERE customer.custid = ot.custid
AND ot.trans_orderid = 5678
)
WHERE customer.custid = 1234
AND EXISTS (
SELECT *
FROM order_transaction AS ot
WHERE customer.custid = ot.custid
AND ot.trans_orderid = 5678
);
Хотя синтаксис выглядит повторяющимся, хороший оптимизатор должен уметь распознавать повторения и соответственно оптимизировать. Действительно ли текущая версия вашего продукта SQL действительно хорошо оптимизирует его на практике - это, конечно, другой вопрос. Но учтите следующее: если выбранный вами продукт SQL поддерживает стандартный синтаксис, но не оптимизирует его должным образом, стоит ли «поддержка» чего-нибудь?
Если вы хотите использовать стандартный SQL (как, впрочем, и IMO :), и хотите более «компактный» синтаксис, взгляните на MERGE
или MERGE (SQL) например может выглядеть так:
MERGE INTO customer
USING (
SELECT ot.custid, ot.forenames,
CASE
WHEN ot.safeplace IS NULL
THEN 'test SAFEPLACE IS NULL'
ELSE 'test Safeplace IS NOT NULL'
END
FROM order_transaction AS ot
WHERE ot.trans_orderid = 5678
) AS source (custid, forenames, safeplace_narrative)
ON customer.custid = source.custid
AND customer.custid = 1234
WHEN MATCHED THEN
UPDATE
SET forenames = source.forenames,
surname = source.safeplace_narrative,
middlename = source.safeplace_narrative;