Оператор Oracle DELETE с факторингом подзапроса
Попытка сделать это (работает в 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);
Но DELETE не делает: ORA-00928: отсутствует ключевое слово SELECT
Мои подзапросы довольно большие, есть ли другой синтаксис, чтобы заставить это работать?
Ответы
Ответ 1
Вы не можете использовать подзапрос факторинга /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));
Ответ 2
Я получил это для работы (что, я уверен, не работает в SQL Server):
DELETE FROM TBL
WHERE TBL.ID IN (
WITH X AS (), Y AS (), Z AS ()
SELECT ID FROM Z
);
Ответ 3
Ну, как минимум, вам нужно, чтобы все запросы с псевдонимом появлялись в инструкции FROM каким-то образом. Я не знаю, есть ли больше проблем, но это обязательно (и я считаю, что 00928 - это ошибка, которая возникает, когда вы этого не делаете).