Оператор Oracle DELETE с факторингом подзапроса - PullRequest
11 голосов
/ 07 июля 2011

Попытка сделать это (работает в SQL Server):

WITH X AS (), Y AS (), Z AS ()
DELETE FROM TBL
WHERE TBL.ID IN (SELECT ID FROM Z);

Это работает в Oracle:

WITH X AS (), Y AS (), Z AS ()
SELECT * FROM TBL
WHERE TBL.ID IN (SELECT ID FROM Z);

Но УДАЛИТЬ не: ORA-00928: отсутствует ключевое слово SELECT

Мои подзапросы довольно большие, есть ли другой синтаксис, чтобы заставить это работать?

Ответы [ 3 ]

12 голосов
/ 07 июля 2011

Вы не можете использовать Факторинг подзапроса / CTE ни с чем, кроме оператора SELECT. Из документации:

Вы можете указать это предложение в любом операторе SELECT верхнего уровня и в большинстве типов подзапросов.

Вы можете сделатьэто:

DELETE FROM tbl WHERE tbl.id IN
(WITH X AS (), Y AS (), Z AS ()
SELECT id FROM TBL
 WHERE TBL.ID IN (SELECT ID FROM Z));
8 голосов
/ 07 июля 2011

Я получил это на работу (что, я уверен, не работает в SQL Server):

DELETE FROM TBL
WHERE TBL.ID IN (
    WITH X AS (), Y AS (), Z AS ()
    SELECT ID FROM Z
);
1 голос
/ 07 июля 2011

Ну, как минимум, вам нужно, чтобы все запросы с псевдонимами как-то появлялись в операторе FROM. Я не знаю, есть ли еще проблемы, но это необходимо (и я считаю, что 00928 - это ошибка, которая возникает, когда вы этого не делаете).

...