我有一个生产数据库DataProd
,IPSubnets
表。此表仅由两列组成:ID(此处未使用(和子网地址(IP_Subnets0
(。
现在,我想将每个IP_Subnets0条目与其所在的物理站点的名称相关联。由于单个站点可以有多个子网,因此我还希望使用关联子网的串联列表按站点对结果进行分组。
到目前为止,我所做的如下:
- 我已从声明站点列表表开始,因为我无法在数据库中创建新的永久表。您可以注意到Site3有两个关联的子网。
- 然后,我从
@SiteList
中选择SiteName
并使用Stuff
像Group_Concat
对IP_Subnets0
一样行事。 - 最后,我做了一个
Group By SiteName
.
法典:
DECLARE @SiteList TABLE (SiteID Int Not Null Primary Key Identity(1,1),
SiteName VarChar(30),
Subnet VarChar(15)
)
INSERT INTO @SiteList
VALUES ('Site1', '192.168.10.0'), ('Site2', '192.168.20.0'),
('Site3', '192.168.30.0'), ('Site3', '192.168.40.0')
SELECT DISTINCT
SL.SiteName,
Subnets = STUFF((SELECT DISTINCT ','+ IP_Subnets0
FROM dbo.v_RA_System_IPSubnets
WHERE IP_Subnets0 = SL.Subnet
FOR XML PATH('')), 1, 1, '')
FROM
@SiteList SL
GROUP BY
SL.SiteName
当我这样做时,我收到一个错误
Msg 8120,级别 16 "@SiteList.Subnet"在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中
在STUFF
内的WHERE
子句的行上。
我不明白问题是什么。我已经类似地使用了这篇Stuff
作品(尽管不像我在这里那样使用声明的表,而是使用数据库中的实际表(,并且一切顺利。
知道吗?
您在这里没有聚合任何数据 - 按现有方式运行查询,没有最后一行 - 即删除GROUP BY
语句。
更新的查询
DECLARE @SiteList TABLE (SiteID Int Not Null Primary Key Identity(1,1),
SiteName VarChar(30),
Subnet VarChar(15)
)
INSERT INTO @SiteList
VALUES ('Site1', '192.168.10.0'), ('Site2', '192.168.20.0'),
('Site3', '192.168.30.0'), ('Site3', '192.168.40.0')
SELECT DISTINCT
SL.SiteName,
Subnets = STUFF((SELECT DISTINCT ','+ IP_Subnets0
FROM dbo.v_RA_System_IPSubnets
--WHERE IP_Subnets0 = SL.Subnet -- your where clause
WHERE SiteName = SL.SiteName -- you want to match on sitename
FOR XML PATH('')), 1, 1, '')
FROM
@SiteList SL