Ответ 1
Мне нравится использовать для этого предложения EXISTS:
DELETE FROM TableA
WHERE
<<put your array condition here>>
AND NOT EXISTS
(SELECT 1 FROM TableB Where TableB.ID=TableA.ID)
Можно удалить записи на основе удовлетворенного условия с помощью запроса соединения?
Например, у меня есть таблица ссылок, объединяющая 3 записи. Запрос, который у меня на данный момент удаляет записи из этой таблицы, где один из идентификаторов не является IN()
взломанным массивом Php. Я понял, что запрос должен удалять записи из этой таблицы только в том случае, если идентификатор не существует в массиве и принадлежит к какой-либо другой таблице, основанной на ссылке на другую таблицу.
Мне нравится использовать для этого предложения 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
Нет, это не опечатка, да, вам сделать нужно "FROM TableA" дважды. По крайней мере, вам нужен второй FROM (первый необязательный). Преимущество заключается в том, что он работает как для 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
Удалить с помощью 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
DELETE FROM TableA
LEFT OUTER JOIN TableB
WHERE TableB.Column IS NULL
Удалит записи в таблице A, которые не имеют соответствующей записи в 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 с указанным выше синтаксисом запроса.
Самый простой способ удаления на основе объединения заключается в следующем:
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
.
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