Что такое «обновляемые запросы E153 с подзапросами» в стандарте SQL? - PullRequest
0 голосов
/ 07 января 2010

У меня нет (дорогого) стандарта SQL под рукой; Что такое обновляемые запросы в ядре / фундаменте SQL?

Я вижу, что PostgreSQL не поддерживает их, но некоторые другие базы данных поддерживают; Можете ли вы указать мне на документацию о том, как они работают в этих базах данных?

PostgreSQL имеет переписывающие запросы и обновляемые представления с правилом system ; это сильно отличается?

1 Ответ

0 голосов
/ 07 января 2010

Я только что нашел этот пример 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 не позволяет обновлять выражения запросов, которые не являются именами таблиц. На обновляемых представлениях ведется определенная работа. Я не уверен, насколько полезна эта функция вне представлений, но стандарт определенно интересен и более странен, чем ожидалось.

[Здесь одиноко. Выбрав мой ответ как лучший.]

...