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


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

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

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

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

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

кто может помочь?

5 73

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
)

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

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