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, де ідентифікатор взагалі НЕ існує в таблиці 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 Дякую за запит. Ви обов’язково повинні дати свій коментар як відповідь.
Аналітичний чернець

@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

цей запит є більш ефективним, ніж SELECT * FROM B WHERE NOT ISIST (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

Якщо ви налаштовані на використання ІСНУЄ, ви можете використовувати наступне в 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.