sql: проверьте, существует ли запись в таблице A в таблице B

80

У меня есть таблица определений, которая, как я знаю, поддерживается не очень хорошо, давайте назовем ее table A. У меня есть другая таблица (назовите ее table B), которая намного меньше и в идеале должна быть таблицей, subset of table Aно я знаю, что table Aона несколько устарела и не содержит новых записей, находящихся в Table B.

Обратите внимание, что таблицы A и B имеют разные столбцы.

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

Я хочу, чтобы все строки в таблице B были такими, чтобы идентификатор в таблице B НЕ существовал в таблице A. Это не просто соответствует строкам в таблице A; Мне нужны только строки в таблице B, где ID вообще НЕ существует в таблице A.

кодирующая ручка
источник

Ответы:

172
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)
gdoron поддерживает Монику
источник
@ algotr8der, был рад помочь. Добрый день.
gdoron поддерживает Монику
10
select * from TableB b where b.ID not in (select a.ID from TableA a)
vakio
2
@vakio Спасибо за вопрос. Вы обязательно должны поставить свой комментарий в качестве ответа.
Analytical Monk
@AnalyticalMonk Надеюсь, вы знаете, что это точно такой же запрос, который дает точно такие же результаты. Просто немного другой синтаксис, вот и все
gdoron поддерживает Монику
2
@ManosKounelakis Select 1означает возврат 1в качестве результата для каждой строки. Он часто используется для обозначения того, что результаты не имеют значения, но важно только существование. Вы можете изменить 1любое допустимое значение (*, 1,2,3, столбец1, столбец2), и результаты не изменятся.
gdoron поддерживает Монику
28

Классический ответ, который работает практически в любой среде:

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

иногда НЕ СУЩЕСТВУЕТ может быть не реализовано (не работает).

Данил Жеребецкий
источник
Спасибо, это очень помогло!
lenach87 08
этот запрос более эффективен, чем SELECT * FROM B WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.ID = B.ID)
teteArg
DUAL - это специальная таблица с одной строкой и одним столбцом, которая по умолчанию присутствует во всех базах данных Oracle. Владельцем DUAL является SYS (SYS владеет словарем данных, поэтому DUAL является частью словаря данных), но DUAL может быть доступен каждому пользователю. В таблице есть единственный столбец VARCHAR2 (1) с именем DUMMY, имеющий значение «X». MySQL позволяет указывать DUAL в виде таблицы в запросах, которым не нужны данные из каких-либо таблиц. В SQL Server DUAL таблицы не существует, но вы можете ее создать.
Дэвид Кариуки
14

Если вы настроены на использование EXISTS, вы можете использовать в SQL Server следующее:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)
Эйб Мисслер
источник
3

Это тоже работает

SELECT *
FROM tableB
WHERE ID NOT IN (
  SELECT ID FROM tableA
);
Кай Донг
источник
0

Или если "НЕ СУЩЕСТВУЕТ" не реализовано

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
Дафланк
источник