Query 1SQL JOIN Condition переехал с тем, где пункт производит различия
select count(1)
from sdb_snmp_sysdata s
left join sdb_snmp_entphysicaltable e on s.source = e.source **and e.class = 3**
left join SDB_DF_DEVICE_DNS dns on dns.source = s.source
left join sdb_fdb_node f on upper(f.oldnodeid) = upper(dns.dns_name)
where (regexp_like(s.descr, 'NFXS-F FANT-F ALCATEL-LUCENT|Motorola APEX3000')
or regexp_like(e.descr, 'Motorola BSR64000 HD 100A Redundant Chassis|AS2511-RJ chassis')
or trim(e.ModelName) in ('RFGW1', 'ARCT01949', 'ARCT03253', 'UBR10012', 'WS-C3750-48TS-S', 'WS-C3750V2-48TS-S')
or e.name like '%Nexus5596 Chassis%')
Запрос 2:
select count(1)
from sdb_snmp_sysdata s
left join sdb_snmp_entphysicaltable e on s.source = e.source
left join SDB_DF_DEVICE_DNS dns on dns.source = s.source
left join sdb_fdb_node f on upper(f.oldnodeid) = upper(dns.dns_name)
where (regexp_like(s.descr, 'NFXS-F FANT-F ALCATEL-LUCENT|Motorola APEX3000')
or regexp_like(e.descr, 'Motorola BSR64000 HD 100A Redundant Chassis|AS2511-RJ chassis')
or trim(e.ModelName) in ('RFGW1', 'ARCT01949', 'ARCT03253', 'UBR10012', 'WS-C3750-48TS-S', 'WS-C3750V2-48TS-S')
or e.name like '%Nexus5596 Chassis%') **and e.class = 3**
Эти два запроса возвращают разное количество строк путем изменения e.class condition from on clause to where clause
. Я не могу понять. любая помощь приветствуется.
Мое понимание: запрос 1 левое внешнее соединение между sysdata и entphysicaltable hash join происходит после полного сканирования отдельных таблиц. во втором запросе 2 соединение происходит после того, как entphysicaltable сводится к записям, содержащим только entphysicaltable.class = 3.
для меня запрос имеет тот же смысл, но возвращает разные результаты.
Я могу связать это question Я хотел бы знать конкретную причину.
Где вы перемещаете предикат 'e.class = 3' из' ON' в 'WHERE', LEFT JOIN' преобразуется в' INNER JOIN'. Вы должны сделать это как 'WHERE (e.class = 3 ИЛИ e.class IS NULL) ...', если вы хотите, чтобы он был эквивалентным. –