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