2012-09-18 75 views
2

這裏是我的表的簡化版本如何比較同一個表中的記錄,並找到丟失記錄

Name  Vlan 
Switch 1 1 
Switch 1 2 
Switch 1 3 
Switch 2 1 
Switch 2 2 

我想比較屬於交換機1與所有VLAN屬於開關2並打印出所有的VLAN在其中一個使用SQL查詢的交換機中丟失。是否有可能這樣做?請注意所有數據駐留在同一個表內。

在上面提供的示例數據,查詢應返回行3

Switch 1, 3 

這裏是我做過這樣的嘗試(我的要求比簡化版多個條件卻很少在我的查詢)查詢:

Select Vlans.VLANID From VLANS 
JOIN Nodes ON 
VLANS.NodeId = Nodes.NodeID 
Where Nodes.sysName LIKE 'SSW010%' and Vlans.VlanID NOT In 
(Select Vlans.VLANID AS Vlan2 From VLANS 
JOIN Nodes ON 
VLANS.NodeId = Nodes.NodeID 
Where Nodes.sysName LIKE 'SSW001%') 
+0

至極RDBMS您使用的是MS SQL服務器,Oracle,MySQL的?請充分重申您的問題。發佈你已經嘗試過的,任何正在運行的查詢,無所謂它都會返回正確的解決方案,是一個起點,也許你離正確的答案還有很遠的距離。 – Yaroslav

回答

3

這會給你以後的。它不會對數據做任何假設,並會提供所有缺失的記錄。如果你想限制它只是'切換1',然後將其添加到WHERE子句。

SELECT 
    t1.Name, 
    t1.Vlan 
FROM t t1 
WHERE NOT EXISTS (SELECT 1 
        FROM t t2 
        WHERE t2.Name <> t1.Name 
        AND t2.Vlan = t1.Vlan) 

CREATE TABLE t 
(
    Name VARCHAR(10), 
    Vlan INT 
) 


INSERT INTO t VALUES('Switch 1',1) 
INSERT INTO t VALUES('Switch 1', 2) 
INSERT INTO t VALUES('Switch 1', 3) 
INSERT INTO t VALUES('Switch 2', 1) 
INSERT INTO t VALUES('Switch 2', 2) 
1

這應該有效。

select 
    t1.Name 
    ,t1.Vlan 
from table t1 
left join table t2 
    on t1.Vlan = t2.Vlan 
and t1.Name='Switch 1' 
and t2.Name = 'Switch 2' 
where t2.Name is null 
union 
select 
    t1.Name 
    ,t1.Vlan 
from table t1 
left join table t2 
    on t1.Vlan = t2.Vlan 
and t1.Name='Switch 2' 
and t2.Name = 'Switch 1' 
where t2.Name is null 
+0

這是讓你屬於開關1和缺少到開關2的值,但相反的情況呢? –

+0

呃好的:P ..更新......這很清楚:P –

3

使用MS SQL Server。檢查該工作代碼上SQL Fiddle

SELECT T1.Name, T1.Vlan 
    FROM yourTable T1 
WHERE NOT EXISTS (SELECT 1 
        FROM yourTable T2 
        WHERE T2.Vlan = T1.Vlan 
         AND T2.Name <> T1.Name) 
1
SELECT * 
FROM yourTable 
WHERE [Name] = 'Switch1' 
AND [Vlan] NOT IN(SELECT [Vlan] FROM yourTable WHERE [Name] = 'Switch2') 


Name Vlan 
Switch1 3 
相關問題