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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

УДАЛИТЬ на основе соединения:

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

Удалить с помощью SubQuery:

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

Ответ 4

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

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

Ответ 5

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 с указанным выше синтаксисом запроса.

Ответ 6

Самый простой способ удаления на основе объединения заключается в следующем:

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

Обратите внимание, что нам нужно указать FROM дважды, один для части DELETE и один для части JOIN.

Ответ 7

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

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

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