ВЫБЕРИТЕ * ГДЕ НЕ СУЩЕСТВУЕТ
Я думаю,что я иду по правильному пути с этим... Пожалуйста, потерпите меня, так как мой SQL не самый большой
Я пытаюсь запросить базу данных, чтобы выбрать все из одной таблицы, где определенные ячейки не существуют в другой. Это не имеет большого смысла, но я надеюсь, что этот кусок кода будет
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Так что в принципе у меня есть одна таблица со списком сотрудников и их детали. Затем еще одна таблица с некоторыми другими деталями, включая их имя. Где в таблице eotm_dyn нет имени, что означает, что для них нет записи, я хотел бы точно узнать, кто они, или, другими словами, посмотреть, что именно отсутствует.
приведенный выше запрос ничего не возвращает, но я знаю, что есть 20ish имена отсутствуют, поэтому я, очевидно, не получил его правильно.
кто может помочь?
5 ответов:
вы не присоединились к таблице в своем запросе.
ваш исходный запрос всегда будет возвращать нечего, если нет никаких записей в
eotm_dyn
в этом случае он будет возвращать все.предполагая, что эти таблицы должны быть соединены на
employeeID
использовать следующий:SELECT * FROM employees e WHERE NOT EXISTS ( SELECT null FROM eotm_dyn d WHERE d.employeeID = e.id )
вы можете объединить эти таблицы с
LEFT JOIN
ключевое слово и отфильтроватьNULL
'S, но это, вероятно, будет менее эффективным, чем использование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
вы можете сделать левое соединение и утверждать, что присоединенный столбец равен нулю.
пример:
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 )
предполагая, что две таблицы связаны внешним ключом отношения. На этом этапе вы можете использовать множество других вариантов, включая левое соединение. Однако оптимизатор обычно обрабатывает их одинаково в большинстве случаев.
вы также можете посмотреть этот вопрос. Этот пользователь сообщил, что использование соединения обеспечивает лучшую производительность, чем использование подзапроса.