Проверка того, нет ли элемента в другой таблице
Мои таблицы настроены примерно так:
table name: process
fields: name, id_string
table name: value_seach
fields: id_string, value
Я хочу построить оператор select, который отобразит все имена процессов (с ним соответствующий id_string), которые не имеют записи в value_search.
id_string в таблице процессов может иметь значение NULL и по-прежнему иметь имя, но при необходимости следует исключить их. Id_string в value_search никогда не может быть null
Как это сделать?
Ответы
Ответ 1
В общем случае, если вам нужны строки, которые не существуют в другой таблице, тогда LEFT JOIN в другой таблице и WHERE... NULL для столбца во второй таблице. Также вы упомянули, что вам не нужны строки, где process.id_string равно NULL.
SELECT p.name, p.id_string
FROM
process p
LEFT JOIN value_search v
ON v.id_string = p.id_string
WHERE
v.id_string IS NULL
AND p.id_string IS NOT NULL
Это называется антисоединением.
Ответ 2
Я считаю, что использование Not Exists
будет вашим лучшим вариантом здесь.
SELECT p.name, p.id_string
FROM process p
WHERE
NOT p.id_string IS NULL AND
NOT EXISTS(
SELECT NULL
FROM value_search v
WHERE p.id_string = v.id_string)
Ответ 3
Запрос, который вы хотите, должен выглядеть примерно так. Обратите внимание, что JOIN будет значительно быстрее, чем подзапрос в предложении WHERE.
SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
ON p.id_string = v.id_string
AND p.id_string IS NOT NULL
AND v.id_string IS NULL
В равной степени допустимый вариант запроса выше:
SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
ON p.id_string = v.id_string
WHERE
p.id_string IS NOT NULL
AND v.id_string IS NULL
Ответ 4
SELECT
name,
id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach