2010-11-04 2 views
15

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

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

+0

Это довольно абстрактно, пример (или настоящая вещь) был бы замечательным. В противном случае я понял бы, что вы можете использовать левые внешние соединения и IS NULL для правой стороны, чтобы определить записи, которые нужно удалить. – 0xCAFEBABE

+0

Вы не можете сделать DELETE FROM X JOIN Y на X.ID = Y.ID, если это то, о чем вы просите. – dotariel

ответ

9

Я хотел бы использовать EXISTS пункты для этого:

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

+1 Для существует. Короткое замыкание! – JNK

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

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

+0

Не уверен в других базах данных, но в MySql вам определенно нужно будет сделать, как DELETE TableA FROM TableA LEFT JOIN .. –

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

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

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

+0

Это будет очень низкий запрос ... – JNK

17

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

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

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

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

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

УДАЛИТЬ, основанные на регистрации:

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 
1

Самый простой способ удаления на основе соединения является следующим: 1. Напишите запрос, используя ЗЕЬЕСТ вместо ВЕЬЕТЕ

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

2. Заменить SELECT COLUMNS с УДАЛИТЬ ИЗ ТАБЛИЦЫ

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

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

1
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 

Вы можете сначала использовать оператор выбора и проверить свои записи, которые вы хотите удалить, а затем удалить отборное заявление и добавить Удалить из имя_таблицы с указанным выше синтаксисом запросов.

Смежные вопросы