Подтвердить что ты не робот

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

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

Таблица A:

ID
1
2
3
4

Таблица B:

ID
1
2
3

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

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

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

4b9b3361

Ответ 1

Вы можете использовать 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?

Ответ 2

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

  • НЕ СУЩЕСТВУЕТ
  • NOT IN
  • 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 (столбцы с нулевым значением):

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

Ответ 3

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

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

Это удалит их

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

Ответ 4

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);

Ответ 5

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

Ответ 6

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)