Объяснение УДАЛЕНИЯ SQL - PullRequest
2 голосов
/ 20 марта 2019

Этот запрос работает:

Есть два последовательных ОТ.Когда я удаляю первый, он не работает, почему?

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

Спасибо

Ответы [ 2 ]

5 голосов
/ 20 марта 2019

Это из-за объединения таблиц.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
0 голосов
/ 20 марта 2019

Вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...