SQL Удалить на основе условия в соединении - PullRequest
18 голосов
/ 04 ноября 2010

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

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

Ответы [ 7 ]

27 голосов
/ 27 апреля 2011

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

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

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

DELETE TableA
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL
10 голосов
/ 04 ноября 2010

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

DELETE FROM TableA
WHERE
  <<put your array condition here>> 
  AND NOT EXISTS 
  (SELECT 1 FROM TableB Where TableB.ID=TableA.ID)
8 голосов
/ 23 ноября 2014

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

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

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
5 голосов
/ 25 мая 2017
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 с вышеуказанным синтаксисом запроса.

5 голосов
/ 04 ноября 2010
DELETE FROM TableA
LEFT OUTER JOIN TableB
WHERE TableB.Column IS NULL

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

2 голосов
/ 16 августа 2015

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

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 части.

1 голос
/ 04 ноября 2010
delete from TableA
where id in 
(
   select id from TableA
   except select id from TableB
)

Что означает «удалить из таблицы А, где идентификатор в таблице а, но не в таблице б)

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

...