Ошибка с left join

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
veart
Сообщения: 29
Зарегистрирован: 25 янв 2006, 09:39

Ошибка с left join

Сообщение veart » 21 авг 2008, 06:09

IB 7.5.1
Есть запрос:

Код: Выделить всё

select ps.docdate /*, e.basedochead*/
from dochead dh 
        inner join payspec ps on (ps.basedochead = dh.id_dochead  
                                            and dh.dockind in (8,13)
                                            and dh.client_index=1241  
                                            and dh.doc_date > :SaldoDate)
     left join dochead_export e on (e.dochead=ps.dochead and ps.dockind = 14)
Он возвращает 4 записи. Но если убираем left join:
т.е. запрос получается:

Код: Выделить всё

select ps.docdate /*, e.basedochead*/
from dochead dh 
        inner join payspec ps on ps.basedochead = dh.id_dochead  
                                            and dh.dockind in (8,13)
                                            and dh.client_index=1241  
                                            and dh.doc_date > :SaldoDate
- в результате их 170.

Насколько я понял - он условие из left join - ps.dockind = 14 применяет уже к результату или к предыдущему inner join (их там действительно 4 записи с ps.dockind = 14), а не как условие присоединения таблицы dochead_export.
По идее left join никак не должен уменьшить количество выбираемых записей. И условие - on (e.dochead=ps.dochead and ps.dockind = 14) - это условие присоединения таблицы. Если оно ложно - прилепи NULL и все. Или я не прав? В файрберде подобные запросы проходят.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 21 авг 2008, 09:41

бага у них в оптимизаторе. Если в 8.0 запрос работает аналогично, то пиши им в баг-трекер.

Ответить