Подтвердить что ты не робот

Проверка того, нет ли элемента в другой таблице

Мои таблицы настроены примерно так:

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

Как это сделать?

4b9b3361

Ответ 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