Sql 如何比较同一表中的记录并查找丢失的记录

Sql 如何比较同一表中的记录并查找丢失的记录,sql,sql-server,unique,Sql,Sql Server,Unique,这是我表格的简化版本 Name Vlan Switch 1 1 Switch 1 2 Switch 1 3 Switch 2 1 Switch 2 2 我想比较属于交换机1的所有VLAN和属于交换机2的所有VLAN,并使用SQL查询打印其中一个交换机中缺少的VLAN。有可能吗?注意:所有数据都位于同一个表中 对于上面提供的示例数据,查询应返回第3行 Switch 1, 3 这是我之前尝试的查询。我的需求与查询中的简化版本相比,条件很少: Select

这是我表格的简化版本

Name      Vlan
Switch 1    1
Switch 1    2
Switch 1    3
Switch 2    1
Switch 2    2
我想比较属于交换机1的所有VLAN和属于交换机2的所有VLAN,并使用SQL查询打印其中一个交换机中缺少的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%')
这应该行得通

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

这会给你你想要的。它不会对数据进行任何假设,并会给出所有缺失的记录。如果要将其限制为仅“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)

使用MS SQL Server。在上检查此工作代码


这将为您获取属于开关1但缺少开关2的值,但反过来呢?您使用的是哪种RDBMS、MS SQL Server、Oracle和MySQL?请充分重新标记您的问题。发布您尝试过的任何有效查询,不管它是否返回正确的解决方案,都是一个起点,也许您离正确答案不远。
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)
SELECT * 
FROM yourTable 
WHERE [Name] = 'Switch1'
AND [Vlan] NOT IN(SELECT [Vlan] FROM yourTable WHERE [Name] = 'Switch2')


Name    Vlan
Switch1 3