ВЫБЕРИТЕ * ГДЕ НЕ СУЩЕСТВУЕТ - PullRequest
86 голосов
/ 27 мая 2009

Я думаю, что я иду по правильному пути с этим ... Пожалуйста, потерпите меня, так как мой SQL не самый лучший

Я пытаюсь запросить базу данных, чтобы выбрать все из одной таблицы, где определенные ячейки не существуют в другой. Это не имеет большого смысла, но я надеюсь, что этот фрагмент кода будет

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Так что в основном у меня есть одна таблица со списком сотрудников и их данными. Тогда другая таблица с некоторыми другими деталями, включая их имя. Там, где имя отсутствует в таблице eotm_dyn, то есть для них нет записи, я хотел бы точно узнать, кто они, или, другими словами, увидеть, чего именно не хватает.

Приведенный выше запрос ничего не возвращает, но я знаю, что пропущено 20 имен, так что, очевидно, я не понял его правильно.

Может кто-нибудь помочь?

Ответы [ 5 ]

143 голосов
/ 27 мая 2009

Вы не присоединились к таблице в своем запросе.

Ваш исходный запрос всегда будет ничего не возвращать, если в eotm_dyn вообще нет записей, в этом случае он будет возвращать все.

Предполагая, что эти таблицы должны быть объединены в employeeID, используйте следующее:

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

Вы можете объединить эти таблицы с ключевым словом LEFT JOIN и отфильтровать NULL, но это, вероятно, будет менее эффективным, чем использование NOT EXISTS.

78 голосов
/ 27 мая 2009
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

OR

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

OR

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
12 голосов
/ 27 мая 2009

Вы можете выполнить левое соединение и подтвердить, что объединенный столбец равен NULL.

Пример:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
7 голосов
/ 27 мая 2009
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Никогда не возвращает никаких записей, если eotm_dyn пусто. Вам нужно какие-то критерии по SELECT name FROM eotm_dyn вроде

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

при условии, что две таблицы связаны отношением внешнего ключа. На этом этапе вы можете использовать множество других опций, включая левое соединение. Однако оптимизатор обычно обрабатывает их одинаково в большинстве случаев.

4 голосов
/ 27 мая 2009

Вы также можете взглянуть на этот связанный вопрос . Этот пользователь сообщил, что использование объединения обеспечивает более высокую производительность, чем использование подзапроса.

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