sql server 2008 - sql搜索基于一组行的唯一列



你好,我是SQL的新手,遇到了一个问题。首先来描述一下我在做什么。我有一个选择查询来连接3个表,以获得数据,这些数据为我提供了一组不同集群中的esx主机和主机上每个vmnic看到的VLAN中继。现在,我需要遍历这个列表并找到集群中具有与其他主机不匹配的虚拟网卡的每个主机,因为我们希望vLAN trunk在特定集群中所有主机的虚拟网卡上匹配。下面是我运行查询后的结果示例-

------------------------------------------------------------
|  Cluster  |  Host  |  VMNIC  |  VLAN_TRUNK               |
------------------------------------------------------------
|  clst001  | c1hst1 | vmnic01 |  401 501-505 508 709 1505 |
|  clst001  | c1hst1 | vmnic02 |  401 501-505 709          |
|  clst001  | c1hst1 | vmnic03 |  401 501-505 508 709 1505 |
|  clst001  | c1hst2 | vmnic01 |  401 501-505 508 709 1505 |
|  clst001  | c1hst2 | vmnic02 |  401 501-505 508 709 1505 |
|  clst001  | c1hst2 | vmnic03 |  401 501-505 508 709 1505 |
|  clst001  | c1hst3 | vmnic01 |  401 501-505 508 709 1505 |    
|  clst001  | c1hst3 | vmnic02 |  401 501-505 508 709 1505 |
|  clst001  | c1hst3 | vmnic03 |  401 501-505 508 709 1505 |
|  clst002  | c2hst1 | vmnic01 |  408 501-505 522 701 1555 |
|  clst002  | c2hst1 | vmnic04 |  408 501-505 522 701 1555 |
|  clst002  | c2hst1 | vmnic05 |  408 501-505 522 701 1555 |
|  clst002  | c2hst2 | vmnic01 |  408 501-505 522 701 1555 |
|  clst002  | c2hst2 | vmnic04 |  408 501-505 701 1555     |
|  clst002  | c2hst2 | vmnic05 |  408 501-505 522 701 1555 |
|  clst002  | c2hst3 | vmnic01 |  408 501-505 522 701 1555 |
|  clst002  | c2hst3 | vmnic04 |  408 501-505              |
|  clst002  | c2hst3 | vmnic05 |  408 501-505 522 701 1555 |
|  clst003  | c3hst1 | vmnic01 |  505 622 745              |
|  clst003  | c3hst1 | vmnic02 |  505 622 745              |
|  clst003  | c3hst2 | vmnic01 |  505 622 745              |
|  clst003  | c3hst2 | vmnic02 |  505 622 745              |
------------------------------------------------------------

请注意,我使用文本编辑器构建了上面的描述,以提供我所看到的视觉说明。

我希望实现的是能够识别基于集群和主机的唯一VLAN_TRUNK。例如,我想从上面的表中确定每个集群和主机中有问题的主机vlan是-

------------------------------------------------------------
|  Cluster  |  Host  |  VMNIC  |  VLAN_TRUNK               |
------------------------------------------------------------
|  clst001  | c1hst1 | vmnic02 |  401 501-505 709          |
|  clst002  | c2hst2 | vmnic04 |  408 501-505 701 1555     |
|  clst002  | c2hst3 | vmnic04 |  408 501-505              |
------------------------------------------------------------

我有大约4000个这样的行,大约100个集群,每个集群都有不同数量的主机和vmnic。

我试过使用计数,不同的功能,但这对我来说不太管用。这对我来说很难张贴查询,因为这个网站在工作中被封锁,所以我从家里张贴这个。如果有人能指出我在正确的方向上如何解决这个问题,这将是非常感激!

你真的应该显示你到目前为止所尝试的,但是假设我理解你的问题是正确的,它可以用COUNT来完成。

根据您提供的数据,下面是一个示例。看一下SQL语句,您将看到COUNTGROUP BY是如何在感兴趣的列上执行的。然后,我们将其限制为COUNT为1的那些,以获得"不同"的列表。
DECLARE @Data AS TABLE (Cluster VARCHAR(20),  Host VARCHAR(20),  VMNIC VARCHAR(20), VLAN_TRUNK  VARCHAR(200))             
INSERT INTO @Data (Cluster, Host, VMNIC, VLAN_TRUNK)
VALUES 
('clst001', 'c1hst1', 'vmnic01', '401 501-505 508 709 1505'),
('clst001', 'c1hst1', 'vmnic02', '401 501-505 709'),
('clst001', 'c1hst1', 'vmnic03', '401 501-505 508 709 1505'),
('clst001', 'c1hst2', 'vmnic01', '401 501-505 508 709 1505'),
('clst001', 'c1hst2', 'vmnic02', '401 501-505 508 709 1505'),
('clst001', 'c1hst2', 'vmnic03', '401 501-505 508 709 1505'),
('clst001', 'c1hst3', 'vmnic01', '401 501-505 508 709 1505'),    
('clst001', 'c1hst3', 'vmnic02', '401 501-505 508 709 1505'),
('clst001', 'c1hst3', 'vmnic03', '401 501-505 508 709 1505'),
('clst002', 'c2hst1', 'vmnic01', '408 501-505 522 701 1555'),
('clst002', 'c2hst1', 'vmnic04', '408 501-505 522 701 1555'),
('clst002', 'c2hst1', 'vmnic05', '408 501-505 522 701 1555'),
('clst002', 'c2hst2', 'vmnic01', '408 501-505 522 701 1555'),
('clst002', 'c2hst2', 'vmnic04', '408 501-505 701 1555'),
('clst002', 'c2hst2', 'vmnic05', '408 501-505 522 701 1555'),
('clst002', 'c2hst3', 'vmnic01', '408 501-505 522 701 1555'),
('clst002', 'c2hst3', 'vmnic04', '408 501-505'),
('clst002', 'c2hst3', 'vmnic05', '408 501-505 522 701 1555'),
('clst003', 'c3hst1', 'vmnic01', '505 622 745'),
('clst003', 'c3hst1', 'vmnic02', '505 622 745'),
('clst003', 'c3hst2', 'vmnic01', '505 622 745'),
('clst003', 'c3hst2', 'vmnic02', '505 622 745')

SELECT Cluster, Host, VLAN_TRUNK, COUNT(*) Cnt
  FROM @Data
GROUP BY Cluster, Host, VLAN_TRUNK
HAVING COUNT(*) = 1

最新更新