Я пытаюсь определить «Лист» в дереве, но я не понимаю, почему мой запрос не дает мне того, что я хочу.
Вот проблема:
Итак, моя идея заключается в том, что пока идентификатор не находится в столбце p_id, он должен быть «листом».
select id, 'Leaf' as type
from Tree
where id not in (select distinct(p_id)
from Tree)
Однако приведенный выше запрос ничего мне не возвращает.
Решение почти такое же, как у меня, за исключением того, что оно указывает, что p_id не может быть NULL, тогда оно возвращает то, что я хочу.
select id
from Tree
where id not in(select distinct(p_id)
from Tree
where p_id IS NOT NULL)
Я смущен, почему добавление предложения where будет иметь значение?
Ты угадал. Это потому, что NULL ни с чем не сравнивается. Значение не отличается от нуля, а значение не равно нулю.
Вы можете получить результат с помощью следующего запроса:
select distinct t.id,
if (p.id is null, 'Root', if (d.id is null, 'Leaf', 'Inner'))
from Tree t
left join Tree p on p.id=t.p_id
left join Tree d on d.p_id=t.id;
См. dbfiddle.
Итак, пока в списке есть NULL, даже если есть совпадение с другим p_id, ничего не появится?
@DJ-кодирование - Да. Выражение предложения where
оценивается как истинное только в том случае, если id
не соответствует Любые возвращаемых значений p_id
. Поскольку одно из значений p_id равно null
, а null считается неизвестным и никогда не может ничего равный, выражение никогда не оценивается как истинное. Следовательно, строки не возвращаются.
выбрать отдельный a_id, статус из ( выберите a.id как a_id, a.pid как a_pid, b.id как b_id, b.pid как b_pid, случай, когда b.id не равен нулю, а a.pid не равен нулю, тогда «внутренний» Когда b.id равен нулю, тогда «лист», когда a.pid равен нулю, тогда «root», иначе null заканчивается как «status»
из листа a левое соединение листа b на a.id = b.pid)temp
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
^^ Ага.
null
не равняется ничему, даже самому себе.