выберите значение, где оно не существует в другой таблице

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

Таблица A:

ID
1
2
3
4

Таблица B:

ID
1
2
3

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

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

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

52
задан Cœur 15 April 2017 в 18:32
поделиться

6 ответов

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

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

Однако пока я предпочитаю НЕ СУЩЕСТВУЕТ :

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?

88
ответ дан 7 November 2019 в 09:13
поделиться

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

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

Это удалит их

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
3
ответ дан 7 November 2019 в 09:13
поделиться
SELECT ID 
  FROM A 
 WHERE NOT EXISTS( SELECT 1
                     FROM B
                    WHERE B.ID = A.ID
                 )
1
ответ дан 7 November 2019 в 09:13
поделиться
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) 
-2
ответ дан 7 November 2019 в 09:13
поделиться
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);
2
ответ дан 7 November 2019 в 09:13
поделиться

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

  • НЕ СУЩЕСТВУЕТ
  • НЕ В
  • 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 - лучший способ поиска отсутствующих значений, если оба рассматриваемых столбца НЕ НУЛЕНЫ.

27
ответ дан 7 November 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: