Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top