SQL DELETE STATEMENT объяснение

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

Есть два последовательных 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

Спасибо

Можете ли вы поделиться утверждением, которое не работает, и ошибкой, которую вы получаете?

Mureinik 20.03.2019 17:04

И отметьте свой вопрос с помощью базы данных, которую вы используете.

Gordon Linoff 20.03.2019 17:04

Синтаксис многотабличных операторов DELETE различается в зависимости от СУБД (MySQL, Oracle, Microsoft SQL Server и др.). «не работает» близко к бесполезный при описании фактического наблюдаемого поведения. Это сообщение об ошибке? Строки не удалены? Слишком много строк удалено? Что значит "не работает"?

spencer7593 20.03.2019 17:06

Действительно ли работает ColA сначала в равном состоянии ON A.ColA = , а затем в сравнении с NULL WHERE A.ColA IS NULL?

Joakim Danielson 20.03.2019 17:06

@JoakimDanielson: это шаблон для антисоединения. Обратите внимание, что это внешнее соединение со встроенным представлением A... условие в предложении WHERE удалит совпадающие строки, оставив строки из dim, у которых нет совпадающей строки. (Что касается того, работает ли это в операторе DELETE, это действительно зависит от СУБД, какой синтаксис принят и поддерживается.)

spencer7593 20.03.2019 17:08
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
5
78
2

Ответы 2

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

Но это был не вопрос, не так ли?

Joakim Danielson 20.03.2019 17:07

В двух FROM нет ничего неправильного - это разрешено в грамматике

Martin Smith 20.03.2019 17:14

Это из-за соединения таблиц. 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

Другие вопросы по теме