Я только что нашел этот пример Oracle в Википедии, который выглядит как SELECT в левой части обновления:
UPDATE (
SELECT *
FROM articles
JOIN classification c
ON a.articleID = c.articleID
) AS a
SET a.[updated_column] = updatevalue
WHERE c.classID = 1
В то время как большинству баз данных нужно написать запрос в виде:
UPDATE a
SET a.[updated_column] = updatevalue
FROM articles a
JOIN classification c
ON a.articleID = c.articleID
WHERE c.classID = 1
Ссылки: оракул справочные документы , примеры .
Поддерживают ли это другие базы данных? Где это задокументировано?
Теперь, когда я положил свои грязные варежки на стандарт, я просто процитирую это.
E153 относится к:
Подпункт 7.12, «<запрос
выражение> »: <выражение запроса>
обновляемый, хотя его <где
предложение> содержит
Поскольку выражения запроса также являются таблицей (не интуитивно понятной, но в SQL99 4.16.3 Операции с таблицами), это означает, что выражение запроса является «таблицей udpatable». Что в соответствии с 4.16 означает, что я могу ВСТАВИТЬ и УДАЛИТЬ из них.
Что означает, что я могу запустить выше, а также:
DELETE FROM (SELECT * FROM t1 JOIN t2 WHERE t1c1 = t2c3);
Существует еще несколько правил определения выражений запросов, которые можно обновлять, которые содержатся в sql99-foundation 7.11 и 7.12; они скорее вовлечены. PostgreSQL не позволяет обновлять выражения запросов, которые не являются именами таблиц. На обновляемых представлениях ведется определенная работа. Я не уверен, насколько полезна эта функция вне представлений, но стандарт определенно интересен и более странен, чем ожидалось.
[Здесь одиноко. Выбрав мой ответ как лучший.]