我们正在监控网络设备。一个设备可能出现在多个交换机上。
我们想要过滤掉那些在上行链路/端口通道上的设备,以防它也出现在另一个端口上。选择所有其他设备。
假设表格如下所示:
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
条目 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 查询?