ВЫБЕРИТЕ * ГДЕ НЕ СУЩЕСТВУЕТ

Я думаю, что я иду по правильному пути с этим... Пожалуйста, несите меня, поскольку мой 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

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