【发布时间】:2012-07-24 09:14:40
【问题描述】:
我们正在监控网络设备。 一个设备可能出现在多个开关上。
我们想要过滤掉那些在上行链路/端口通道上的设备,以防它也出现在另一个端口上。已选择所有其他设备。
假设表格如下:
HOST, SWITCH, PORT
HostA, Switch1, 01
HostB, Switch1, 02
HostA, Switch2, Po - Po is portchannel / uplink
HostC, Switch2, Po - Po is portchannel / uplink
期望的输出:
HostA, Switch1, 01
HostB, Switch1, 02
HostC, Swtich2, Po - is only on an uplink / so that is OK
Entry HostA, Switch2, Po 需要过滤掉,因为它也出现在另一个端口上。
现在的问题是如何编写有效的查询。
在 SQL 术语中,我们希望选择除 HOST 出现两次的行之外的所有行。然后我们只想要 PORT 不是 'Po' 的那一行
由于子查询,我们当前的查询很慢!? 我假设子查询正在创建一个笛卡尔积 - 对吧?
SELECT * FROM devices t1
WHERE NOT ((Port = 'Po') AND
((Select count(*) from table t2 where t1.host=t2.host AND NOT Port='Po') > 0))
问题又是如何编写更快的 SQL 查询??
【问题讨论】:
标签: sql performance select subquery informix