Re: Что-то непонятное с left join

2011-12-23 Пенетрантность Dmitry Yemanov

23.12.2011 11:31, Tonal пишет:

 Проверяю на существование дырок:
 SQL  select s.ID, s.ORD_NUM, s2.ID, s2.ORD_NUM
 CON  from SYMPTOMS s left outer join SYMPTOMS s2
 CON  on s.ORD_NUM + 1 = s2.ORD_NUM
 CON  where s.PARENT_ID = 450774 and s2.PARENT_ID = 450774
 CON  /*and s2.ID is null*/;

Внеси s2.PARENT_ID = 450774 в условие джойна. Иначе оно тебе 
отбрасывает все записи, не найденные в левом потоке (где s2.PARENT_ID IS 
NULL).



--
Дмитрий Еманов



Re: Что-то непонятное с left join

2011-12-23 Пенетрантность Dmitry Yemanov

23.12.2011 12:50, Dmitry Yemanov пишет:


отбрасывает все записи, не найденные в левом потоке


В правом (внутреннем) потоке, конечно же :-)

--
Дмитрий Еманов



Re: Что-то непонятное с left join

2011-12-23 Пенетрантность Tonal
23.12.2011 15:50, Dmitry Yemanov пишет:
 Проверяю на существование дырок:
 SQL  select s.ID, s.ORD_NUM, s2.ID, s2.ORD_NUM
 CON  from SYMPTOMS s left outer join SYMPTOMS s2
 CON  on s.ORD_NUM + 1 = s2.ORD_NUM
 CON  where s.PARENT_ID = 450774 and s2.PARENT_ID = 450774
 CON  /*and s2.ID is null*/;
 Внеси s2.PARENT_ID = 450774 в условие джойна. Иначе оно тебе
 отбрасывает все записи, не найденные в левом потоке (где s2.PARENT_ID IS
 NULL).
Спасибо.
От я затупил. :)
-- 
Александр Замараев



Что-то непонятное с left join

2011-12-22 Пенетрантность Tonal
Есть табличка:
CREATE TABLE SYMPTOMS (
  ID integer not null,
  PARENT_ID integer,
  ORD_NUM integer
  -- отгрызено полей
  CONSTRAINT PK_SYMPTOMS PRIMARY KEY (ID),
  CONSTRAINT FK_SYMP2SYM_ID FOREIGN KEY (SYM_ID) REFERENCES SYMPTOMS (ID)
);

ORD_NUM - порядковый номер в отображении. Нумерация начинается с 1,
одинаковых и номеров и дырок не допускается.
Выбираю уровень:
SQL select s.ID, s.ORD_NUM from SYMPTOMS s where s.PARENT_ID = 450774;

  ID  ORD_NUM
 
  4507751
  4507762
  4507773

Проверяю на существование дырок:
SQL select s.ID, s.ORD_NUM, s2.ID, s2.ORD_NUM
CON from SYMPTOMS s left outer join SYMPTOMS s2
CON on s.ORD_NUM + 1 = s2.ORD_NUM
CON where s.PARENT_ID = 450774 and s2.PARENT_ID = 450774
CON /*and s2.ID is null*/;

  ID  ORD_NUM   ID  ORD_NUM
   
  4507751   4507762
  4507762   4507773

Что за ерунда?
А где строка
  4507773 null null

В то же время
select * from RDB$DATABASE l
left join RDB$DATABASE r on l.RDB$RELATION_ID = r.RDB$RELATION_ID + 1
возвращает одну строку все поля от l в которой null - как и ожидалось/

Запрос с not exists отрабатывает нормально выдавая ожидаемую
4507773

select s.ID, s.ORD_NUM
from SYMPTOMS s
where s.PARENT_ID = 450774
and not exists(
 select 1 from SYMPTOMS s2 where s2.PARENT_ID = 450774
 and s.ORD_NUM + 1 = s2.ORD_NUM
)

Что бы это могло быть?
б/р проходит без ошибок.

ОС Kubuntu 11.10 со всеми обновлениями
firebird2.5-super 2.5.0.26074-0.ds4-5 - из стандартного репозитория

firebird2.5-super Version: 2.5.1.26351.ds4-2~bpo60+1ubuntu3 - из ppa
Maintainer: Popa Adrian Marius

-- 
Александр Замараев