Этот запрос работает:
Есть два последовательных FROM. Когда я удаляю первый, он не работает, почему?
DELETE FROM TableA
FROM TableA dim
LEFT OUTER JOIN (
SELECT DISTINCT ColA
FROM TableB
UNION ALL
SELECT DISTINCT ColA
FROM tableC
) A ON A.ColA= dim.ColA
WHERE A.ColA IS NULL
РЕДАКТИРОВАТЬ Это не работает, что, как я предполагал, было правильным:
DELETE
FROM TableA dim
LEFT OUTER JOIN (
SELECT DISTINCT ColA
FROM TableB
UNION ALL
SELECT DISTINCT ColA
FROM tableC
) A ON A.ColA= dim.ColA
WHERE A.ColA IS NULL
Спасибо
И отметьте свой вопрос с помощью базы данных, которую вы используете.
Синтаксис многотабличных операторов DELETE различается в зависимости от СУБД (MySQL, Oracle, Microsoft SQL Server и др.). «не работает» близко к бесполезный при описании фактического наблюдаемого поведения. Это сообщение об ошибке? Строки не удалены? Слишком много строк удалено? Что значит "не работает"?
Действительно ли работает ColA сначала в равном состоянии ON A.ColA = , а затем в сравнении с NULL WHERE A.ColA IS NULL?
@JoakimDanielson: это шаблон для антисоединения. Обратите внимание, что это внешнее соединение со встроенным представлением A... условие в предложении WHERE удалит совпадающие строки, оставив строки из dim, у которых нет совпадающей строки. (Что касается того, работает ли это в операторе DELETE, это действительно зависит от СУБД, какой синтаксис принят и поддерживается.)


Вы можете использовать NOT EXISTS:
DELETE dim
FROM TableA dim
WHERE NOT EXISTS (SELECT 1 FROM TableB B WHERE B.ColA = DIM.ColA) OR
NOT EXISTS (SELECT 1 FROM TableC C WHERE C.ColA = DIM.ColA);
В вашем операторе удаления есть два предложения from, что неверно, оно должно иметь только одно сразу после оператора delete:
DELETE dim
FROM TableA dim LEFT OUTER JOIN
(SELECT ColA
FROM TableB
UNION
SELECT ColA
FROM tableC
) A
ON A.ColA= dim.ColA
WHERE A.ColA IS NULL;
Кроме того, DISTINCT с UNION ALL здесь избыточны, если вы хотите ввести UNIQUE, используйте вместо этого UNION.
Но это был не вопрос, не так ли?
В двух FROM нет ничего неправильного - это разрешено в грамматике
Это из-за соединения таблиц. SQL Engine должен знать, из какого источника удалять данные, и странный синтаксис FROM FROM позволяет это сделать.
У вас есть оператор, функционально эквивалентный этому, который точно такой же, за исключением того, что я заменил псевдоним таблицы для первого предложения FROM:
DELETE dim
FROM TableA dim
LEFT OUTER JOIN (
SELECT DISTINCT ColA
FROM TableB
UNION ALL
SELECT DISTINCT ColA
FROM tableC
) A ON A.ColA= dim.ColA
WHERE A.ColA IS NULL
Можете ли вы поделиться утверждением, которое не работает, и ошибкой, которую вы получаете?