Ответ 1
Я считаю, что это стандартное SQL
Собственно, это не так. Стандартный SQL не имеет синтаксиса UPDATE..FROM
. Скорее, вам нужно использовать скалярный подзапрос для каждого предложения SET
плюс другой для EXISTS
, поэтому синтаксис Standard еще более повторяется, например.
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-продукт по выбору поддерживает синтаксис Standard, но на самом деле не оптимизирует его, значит, "поддержка" стоит чего-то?
Если вы хотите использовать стандартный SQL (так как вы действительно должны ИМО:) и хотите более "компактный" синтаксис, посмотрите 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;