Все, что вам нужно изменить в запросе 1, - это удалить NULL
значения из запроса SELECT DISTINCT
.
SELECT id,
CASE WHEN p_id is null THEN 'Root'
WHEN id not in (select distinct p_id from tree where p_id is NOT NULL) THEN 'Leaf'
ELSE 'Inner'
END AS Type
FROM tree;
Это связано с тем, как значения NULL
обрабатываются в вашей базе данных на основеANSI_NULLS
настроек.
Из документов:
"Указывает ISO-совместимое поведение равно (=) и не равно(<>) Операторы сравнения, когда они используются с нулевыми значениями.
(...)
Когда ANSI_NULLS включен, оператор SELECT, использующий WHERE column_name = NULL, возвращает ноль строк, дажеесли в column_name есть нулевые значения.
(...)
Когда ANSI_NULLS включен, все сравнения с нулевым значением оцениваются как UNKNOWN. "
Я не рекомендую изменять настройки ANSI_NULLS, если вы не знаете, что делаете.Вместо этого я рекомендую изменить ваш запрос и убедиться, что каждый раз, когда вы используете NOT IN
, ваш подзапрос никогда не возвращает значения NULL
, добавив условие WHERE is NOT NULL
в конце.
Вы можетеНайдите больше ответов на эту проблему здесь, на SO, например, здесь (1) и здесь (2) .