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)

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


0

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

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.