【发布时间】:2015-12-18 06:39:13
【问题描述】:
查询 1
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返回不同的行数。我无法弄清楚。任何帮助表示赞赏。
我的理解: sysdata 和 entphysicaltable 散列连接之间的查询 1 左外连接发生在完整扫描各个表之后。 在第二个查询中,在 entphysicaltable 减少为仅包含 entphysicaltable.class= 3 的记录之后发生了 2 连接。
对我来说,查询意义相同,但返回的结果不同。
我可以联系到这个question我想知道一个具体的原因。
【问题讨论】:
-
将
e.class = 3谓词从ON移动到WHERE的位置,LEFT JOIN被转换为INNER JOIN。如果你希望它是等价的,你必须让它像WHERE (e.class = 3 OR e.class IS NULL) ...。