我們正在監視網絡設備。 設備可能出現在多個交換機上。如果col1值退出兩次且col2不爲空,則選擇行
我們想要過濾那些在上行鏈路/端口通道上的設備,以防它出現在另一個端口上。所有其他設備都被選中。
假設表的樣子:
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
的入門玉簪,交換機2,寶需要被過濾掉,因爲它出現在另一個端口上爲好。
現在的問題是如何編寫一個有效的查詢。
在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已經好多了。但有沒有辦法避免子查詢(例如與連接/臨時表) – 2012-07-24 09:50:22
@ThorstenNiehues您可以給連接查詢一槍嗎? – 2012-07-24 11:13:12
非常感謝 - 看起來很棒。我會在今天/明天測試這兩個版本,讓你知道。 – 2012-07-24 13:23:06