SQL Delete на основе условия в соединении

можно удалить записи на основе удовлетворенного условия с помощью запроса соединения?

например, у меня есть таблица ссылок, соединяющая 3 записи. Запрос, который у меня есть на данный момент, удаляет записи из этой таблицы, где один из идентификаторов не IN() взорванный массив Php. Я понял, что запрос должен удалять записи только из этой таблицы, если идентификаторы не существуют в массиве, и они принадлежат к определенной другой таблице на основе ссылки на другую таблицу.

7 ответов


Мне нравится использовать предложения EXISTS для этого:

DELETE FROM TableA
WHERE
  <<put your array condition here>> 
  AND NOT EXISTS 
  (SELECT 1 FROM TableB Where TableB.ID=TableA.ID)

для SQL Server, команда немного отличается:

DELETE FROM TableA
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL

нет, это не опечатка, да, вы do нужно "из таблицы"два раза. По крайней мере, вам нужен второй (первый является необязательным). Следующее имеет то преимущество, что оно работает как для SQL Server, так и для MySQL:

DELETE TableA
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL

вы можете использовать :

удалить на основе соединения:

DELETE A      
FROM TableA AS A
  LEFT OUTER JOIN TableB As B ON A.Id = B.TabaleAId 
WHERE B.Column IS NULL

Удаление С Подзапросом:

DELETE 
FROM TableA AS A
Where
    A.id not in ( Select B.TabaleAId From Tab;eB As B )

или

DELETE FROM TableA
WHERE Not EXISTS 
  (
    SELECT * 
    FROM TableB As B
    Where B.TableAId = TableA.Id
   )

удалить с помощью табличных выражений:

With A 
As
    (
        Select TableA.*
        FROM TableA AS A
            LEFT OUTER JOIN TableB As B ON A.Id = B.TabaleAId 
        WHERE B.Column IS NULL
    )
Delete From A

DELETE FROM TableA
LEFT OUTER JOIN TableB
WHERE TableB.Column IS NULL

удалит записи в tableA, которые не имеют соответствующей записи в TableB. Это то, что вам нужно?


DELETE FROM a
  FROM TableA AS a LEFT OUTER JOIN TableB AS b 
  on a.CALENDAR_DATE = b.CALENDAR_DATE AND a.ID = b.ID 
  Where b.ID is null

вы можете сначала использовать инструкцию select и проверить свои записи, которые вы хотите удалить, а затем удалить инструкцию select и добавить Delete FROM tablename с вышеуказанным синтаксисом запроса.


delete from TableA
where id in 
(
   select id from TableA
   except select id from TableB
)

что означает " удалить из таблицы, где id в таблице a, но не в таблице b)

в противном случае оператор Merge может помочь вам (при совпадении / не совпадении удалить и т. д) http://technet.microsoft.com/en-us/library/bb510625.aspx


самый простой способ удалить на основе join выглядит следующим образом: 1. Напишите запрос, используя инструкцию SELECT вместо инструкции DELETE

  SELECT COLUMNS
    FROM    Table1
            INNER JOIN Table2  ON Table1.YYY = Table2.XXX

2. Заменить столбцы SELECT на DELETE FROM TABLE

 DELETE  FROM Table1
    FROM    Table1
            INNER JOIN Table2 ON Table1.YYY = Table2.XXX

обратите внимание, что нам нужно указать из двух, один для удаления части и один для соединения части.