MySQL "NOT IN" запрос не работает - PullRequest
3 голосов
/ 18 февраля 2012

У меня есть таблица с тремя столбцами: taxon_id, scientific_name_element_id и parent_id.Я хочу найти элементы, которые являются детьми, а не родителями, поэтому в конце структуры.

Я нашел несколько источников, которые предлагали использовать

select taxon_id 
       from  taxon_name_element
       where taxon_id not in 
                          (select parent_id from taxon_name_element)

Но это не работает, я получаю пустой набор, когда я могу на самом деле просмотреть записи и увидеть, что, например, есть, a taxon_id=1 и NO parent_id=1

И наоборот, когда я вижу, что Taxon_id есть в parent_id, я получаю непустой набор результатов

Что я делаю неправильно?Как я могу это исправить?

Ответы [ 2 ]

6 голосов
/ 18 февраля 2012

Есть ли NULL в taxon_name_element.parent_id?

Запрос ...

select taxon_id 
from taxon_name_element
where taxon_id not in (
    select parent_id
    from taxon_name_element
)

... эквивалентен ...

select taxon_id 
from taxon_name_element
where
    taxon_id <> parent_id_1
    AND taxon_id <> parent_id_2
    ...
    AND taxon_id <> parent_id_N

... где parent_id_X - фактические значения, которые в данный момент находятся в столбце parent_id.Если хотя бы одно из них имеет значение NULL, соответствующие выражения taxon_id <> parent_id_X будут «свернуты» в NULL, перетаскивая с ним все выражение WHERE.

Отфильтруйте NULL, чтобы получить то, что вы хотите:

select taxon_id 
from taxon_name_element
where taxon_id not in (
    select parent_id
    from taxon_name_element
    where parent_id is not null
)
2 голосов
/ 18 февраля 2012

Предполагая, что столбец parent_id равен NULL (что означает, что значение не установлено)

Чтобы выбрать все Scientific_Name_element_id , которые не имеют значения для parent_id (значение parent_id равно NULL)

Вы делаете это:

SELECT scientific_name_element_id
FROM YOUR_TABLE
WHERE parent_id IS NULL

Это даст вам список Scientific_name_element_id, у которого нет родителей.

...