ВЫБЕРИТЕ * ГДЕ НЕ СУЩЕСТВУЕТ
Я думаю, что я иду по правильному пути с этим... Пожалуйста, несите меня, поскольку мой SQL не самый большой
Я пытаюсь запросить базу данных, чтобы выбрать все из одной таблицы, где определенные ячейки не существуют в другом. Это много не имеет большого смысла, но я надеюсь, что этот фрагмент кода будет
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Итак, в основном у меня есть одна таблица со списком сотрудников и их подробностями. Затем еще один стол с некоторыми другими деталями, включая их имя. Если имя отсутствует в таблице eotm_dyn, то есть нет записи для них, я хотел бы точно указать, кто они, или, другими словами, посмотреть, что именно отсутствует.
Вышеприведенный запрос ничего не возвращает, но я знаю, что есть 20-значные имена, поэтому я, очевидно, не получил это правильно.
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Вы не присоединились к таблице в своем запросе.
Ваш исходный запрос всегда будет возвращать ничего, если в 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
.
Ответ 2
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)
ИЛИ
SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)
ИЛИ
SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
Ответ 3
Вы можете сделать LEFT JOIN и утверждать, что объединенный столбец равен NULL.
Пример:
SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
Ответ 4
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
)
предполагая, что две таблицы связаны отношением внешнего ключа. На этом этапе вы можете использовать множество других опций, включая LEFT JOIN. Однако оптимизатор, как правило, обрабатывает их в большинстве случаев.
Ответ 5
Вы также можете посмотреть этот связанный вопрос. Этот пользователь сообщил, что использование соединения обеспечивает лучшую производительность, чем использование вспомогательного запроса.