Здравствуйте!

Объясните, где я не прав. Вот тестовый пример:

Создаем таблицу:
create table t_tree (id integer primary key,
                     id_top integer,
                     name varchar(12) );

Заполняем данными:
-- ID    ID_TOP      NAME
-- 1                Запись 1
-- 2        1       Запись 1.1
-- 3        2       Запись 1.1.1
-- 4        2       Запись 1.1.2
-- 5        1       Запись 1.2

INSERT INTO T_TREE (ID, ID_TOP, NAME) VALUES (1, NULL, 'Запись 1');
INSERT INTO T_TREE (ID, ID_TOP, NAME) VALUES (2, 1, 'Запись 1.1');
INSERT INTO T_TREE (ID, ID_TOP, NAME) VALUES (3, 2, 'Запись 1.1.1');
INSERT INTO T_TREE (ID, ID_TOP, NAME) VALUES (4, 2, 'Запись 1.1.2');
INSERT INTO T_TREE (ID, ID_TOP, NAME) VALUES (5, 1, 'Запись 1.2');
commit;

А теперь делаем запрос на записи, не имеющие подчиненных
select t.name from t_tree t
where t.id not in (select t1.id_top from t_tree t1);
Получаем пустой результат.

Если в условие in добавить условие, то результат получается правильный
(логичный с моей точки зрения), хотя на FB 1.5. и первый запрос
возвращал 3 записи (ID=3, 4, 5).
select t.name from t_tree t
where t.id not in (select t1.id_top from t_tree t1 where t1.id_top is
not null);

Проверено на FB 2.0 и FB 2.0.1

С уважением,
Стариков Алексей.

Ответить