SQL, Найти все, что не существует в другой таблице - PullRequest
2 голосов
/ 16 февраля 2012

Итак, у меня есть две таблицы, A и B, я пытаюсь найти значения, которые существуют в столбце таблицы A, которых нет в соответствующем столбце таблицы B, мой текущий код:

SELECT A.x
FROM A
WHERE A.x NOT IN (SELECT B.x FROM B);

Я также пытался:

SELECT A.x
FROM A
WHERE EXISTS NOT (SELECT B.x FROM B);

Но когда я запускаю запрос, в таблице ничего не отображается, я точно знаю, что в столбце "x" в A есть значениякоторые не находятся в столбце «x» в B, но там не отображаются.

У меня такое ощущение, что я делаю что-то чрезвычайно глупое или пропускаю очевидный очевидный ответ, но я устали я работаю над этим слишком долго, чтобы заботиться больше, так что поболеть за любую помощь =)

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Вы пытались использовать OUTER JOIN?

SELECT A.x
FROM A LEFT OUTER JOIN B ON A.x = B.x
WHERE B.x IS NULL
2 голосов
/ 16 февраля 2012

Может ли быть значение null в B.x?Если это так, то not in читается как:

a.x not in (1, 2, 3, null, ...)

Что является сокращением для:

a.x <> 1 and a.x <> 2 and a.x <> 3 and a.x <> null and ...

Поскольку anything <> null оценивается как unknown, условие not in никогда не выполняетсяправда.Результатом является пустой набор строк.Это неприятный побочный эффект трехзначной логики, который удивляет даже опытных разработчиков SQL.

Одним из решений является исключение значения null, например:

SELECT x FROM A WHERE x NOT IN (SELECT x FROM B where x is not null)

Для получения дополнительной информации,см. статью Википедии о трехзначной логике .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...