2

これが私のテーブルの簡略版です

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

スイッチ1に属するすべてのVLANをスイッチ2に属するすべてのVLANと比較し、SQLクエリを使用してスイッチの1つで欠落しているVLANを出力したいと思います。そうすることは可能ですか?すべてのデータが同じテーブル内にあることに注意してください。

上記のサンプルデータでは、クエリは行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%')
4

4 に答える 4

3

MSSQLServerの使用。SQLFiddleでこの動作コードを確認してください

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)
于 2012-09-18T07:29:21.017 に答える
3

これはあなたが求めているものをあなたに与えるでしょう。データについては何も想定せず、欠落しているすべてのレコードを提供します。'Switch 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)
于 2012-09-18T07:23:06.867 に答える
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
于 2012-09-18T07:18:07.597 に答える
1
SELECT * 
FROM yourTable 
WHERE [Name] = 'Switch1'
AND [Vlan] NOT IN(SELECT [Vlan] FROM yourTable WHERE [Name] = 'Switch2')


Name    Vlan
Switch1 3
于 2012-09-18T07:49:04.127 に答える