Проверка, не существует ли элемент в другой таблице - PullRequest
26 голосов
/ 20 февраля 2012

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

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

Я хочу создать оператор выбора, который будет отображать все имена процессов (с соответствующей строкой id_string), у которых нет записи в value_search.

Строка id_string в таблице процессов может иметь значение null и все равно иметь имя, но его необходимо исключить, если это возможно.Строка id_string в value_search никогда не может быть null

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

Ответы [ 4 ]

40 голосов
/ 20 февраля 2012

Обычно, если вы хотите, чтобы строки не существовали в другой таблице, тогда LEFT СОЕДИНЯЙТЕСЬ с другой таблицей и WHERE ... IS 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

Это называется анти-объединением.

27 голосов
/ 20 февраля 2012

Я считаю, что использование 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)
4 голосов
/ 20 февраля 2012

Запрос, который вы хотите, должен выглядеть примерно так. Обратите внимание, что 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
2 голосов
/ 20 февраля 2012
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
...