【发布时间】:2015-04-06 17:49:04
【问题描述】:
SQL 服务器 2012。
编辑: 我的原始查询比应有的更复杂,因为我尝试对表中的字段子集进行 Distinct 查询并将其连接到表本身以获取其他(文本)字段。以下查询也可以解决问题:
SELECT DISTINCT
p1.id
,p1.Name
,CAST( p1.[Description] AS nvarchar(max)) AS Description
,( SELECT [Category] + ', '
FROM [dbo].[Company] AS p2
WHERE p2.Id = p1.Id
ORDER BY Name
FOR XML PATH('') ) AS Categories
FROM [dbo].[Company] AS p1
ORDER BY p1.Id
我有一个表格,其中包含与此类似的数据(每个公司有多个相同的记录,除了类别字段):
+----+------+-----------------+----------+
| Id | Name | Description | Category |
+----+------+-----------------+----------+
| 1 | AAA | <loads of text> | cat1 |
| 1 | AAA | <loads of text> | cat2 |
| 2 | BBB | <even more text>| cat1 |
| 2 | BBB | <even more text>| cat3 |
+----+------+-----------------+----------+
我正在尝试进行查询以获得此结果(每个公司的唯一记录和汇总到 1 个字段中的类别):
| 1 | AAA | <loads of text> | cat1, cat2 |
| 2 | BBB | <even more text>| cat1, cat3 |
使用关于 SO 的各种主题的信息,我想出了这个:
SELECT
t1.Id
,t2.Name
,t2.[Description]
,t1.Category
FROM [dbo].[Company] AS t2
INNER JOIN (SELECT DISTINCT p1.Id
,( SELECT [Category] + ', '
FROM [dbo].[Company] AS p2
WHERE p2.Id = p1.Id
ORDER BY Name
FOR XML PATH('') ) AS Category
FROM [dbo].[Company] AS p1
) AS t1 ON t1.Id = t2.Id
ORDER BY t1.Id
查询结果对 Company 表中的每条记录都有一条记录,类别聚合到类别字段中:
+----+------+-----------------+------------+
| Id | Name | Description | Category |
+----+------+-----------------+------------+
| 1 | AAA | <loads of text> | cat1, cat2 |
| 1 | AAA | <loads of text> | cat1, cat2 |
| 2 | BBB | <even more text>| cat1, cat3 |
| 2 | BBB | <even more text>| cat1, cat3 |
+----+------+-----------------+------------+
我认为如果两个表都匹配,INNER JOIN 只会选择行。 子查询自己产生预期结果(每个 Id 一条记录,聚合类别)。我在整个查询中尝试了另一个 group by 子句,但失败了,因为我无法在 group 子句中包含 Description 字段,因为它是文本类型字段。
我错过了什么?
【问题讨论】:
-
如果描述相同,则使用 distinct 并丢弃描述或聚合描述
-
我需要查询结果中的描述,我无法聚合,我会在描述字段中得到10倍的相同文本。
-
只需添加 GROUP BY Id、Name、Description。
-
Group by 失败,因为 Description 是一个文本字段,它们不能包含在 Group by 子句中。并且我不能在 SELECT 子句中包含不在 Group by 子句中的字段。
-
@tanner:很遗憾,我无法使用服务器功能(公司政策)
标签: sql-server subquery inner-join