выберите значение, если оно не существует в другой таблице - PullRequest
47 голосов
/ 04 июня 2010

У меня есть две таблицы

Таблица A:

ID
1
2
3
4

Таблица B:

ID
1
2
3

У меня есть два запроса:

  • Я хочу выбрать все строки в таблице A, которых нет в таблице B, в данном случае это строка 4.
  • Я хочу удалить все строки, которых нет в таблице B.

Я использую SQL Server 2000.

Ответы [ 6 ]

79 голосов
/ 04 июня 2010

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

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)

Тем не менее, я предпочитаю NOT EXISTS:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)

Есть и другие варианты, эта статья очень хорошо объясняет все преимущества и недостатки:

Стоит ли использовать NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT или NOT EXISTS?

25 голосов
/ 04 июня 2010

Для вашего первого вопроса есть как минимум три общих метода на выбор:

  • НЕ СУЩЕСТВУЕТ
  • НЕ В
  • LEFT JOIN

SQL выглядит так:

SELECT * FROM TableA WHERE NOT EXISTS (
    SELECT NULL
    FROM TableB
    WHERE TableB.ID = TableA.ID
)

SELECT * FROM TableA WHERE ID NOT IN (
    SELECT ID FROM TableB
)

SELECT TableA.* FROM TableA 
LEFT JOIN TableB
ON TableA.ID = TableB.ID
WHERE TableB.ID IS NULL

В зависимости от того, какую базу данных вы используете, производительность каждой может различаться. Для SQL Server (столбцы без значения NULL):

Предикаты NOT EXISTS и NOT IN - лучший способ поиска пропущенных значений, если оба рассматриваемых столбца NOT NULL.

3 голосов
/ 04 июня 2010

Это выберет 4 в вашем случае

SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)

Это удалит их

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
2 голосов
/ 04 июня 2010
select ID from A where ID not in (select ID from B);

или

select ID from A except select ID from B;

Ваш второй вопрос:

delete from A where ID not in (select ID from B);
1 голос
/ 04 июня 2010
SELECT ID 
  FROM A 
 WHERE NOT EXISTS( SELECT 1
                     FROM B
                    WHERE B.ID = A.ID
                 )
0 голосов
/ 04 июня 2010
SELECT ID
  FROM A
 WHERE ID NOT IN (
      SELECT ID
        FROM B);

SELECT ID    
  FROM A a
 WHERE NOT EXISTS (
      SELECT 1 
        FROM B b
       WHERE b.ID = a.ID)

         SELECT a.ID 
           FROM A a    
LEFT OUTER JOIN B b 
             ON a.ID = b.ID    
          WHERE b.ID IS NULL

DELETE 
  FROM A 
 WHERE ID NOT IN (
      SELECT ID 
        FROM B) 
...