sql-server - 进行正确的连接和使用 STUFF
问题描述
我有 2 张桌子。
表 T1:
-----ID-----Name----
1 P1
2 P2
3 P3
表 T2:
-----ID-----PID----Type
1 1 T1
1 2 T2
1 3 T1
2 4 T3
2 5 T3
我想要的是:
----Name----Different_Types-----Type_Names
P1 2 T1,T2
我试过的:
Select distinct T1.NAME,
count(distinct T2.Type) as Different_Types,
from T1
left join T2
on T2.ID = T1.ID
having count(distinct T2.PID) > 2
order by Different_Types desc
有了这个查询,我在我想要的表中有两个第一列,但是在添加第三个时遇到了麻烦......有什么想法吗?
解决方案
认为这应该做你所追求的
DECLARE @T1 TABLE
(
ID INT NOT NULL,
Name CHAR(2) NOT NULL
);
INSERT INTO @T1
VALUES (1,'P1'),(2,'P2'),(3,'P3');
DECLARE @T2 TABLE
(
ID INT NOT NULL,
PID INT NOT NULL,
TypeName CHAR(2) NOT NULL
);
INSERT INTO @T2
VALUES (1,1,'T1'),(1,2,'T2'),(1,3,'T1'),(2,4,'T3'),(2,5,'T3');
SELECT T1.Name,
COUNT(DISTINCT T2.TypeName) AS Different_Types,
STUFF((
SELECT ',' + T.TypeName
FROM @T2 AS T
WHERE T1.ID = T.ID
GROUP BY T.TypeName
FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
,1,1,'')
FROM @T1 AS T1
INNER
JOIN @T2 AS T2
ON T1.ID = T2.ID
GROUP BY T1.ID, T1.Name
HAVING COUNT(DISTINCT T2.PID) > 2;
编辑:
将您的 LEFT 更改为 INNER 连接,因为您无论如何都在有子句中引用 T2 表。
推荐阅读
- audio - 如何使用 FFMPEG 混合多个音轨并调整每个音量?
- java - 如果在构造函数中给定扩展类,JavaFX 扩展场景类会出现问题
- c - 为什么我的 MQL5 函数会收到此错误消息?
- angular - `selector` 在页面刷新时返回值,`onInit` 值显示为未定义
- docker - 使用 Docker 容器空闲的 Condor 作业:“警告:请注意:没有机器匹配作业的约束”
- nginx - 如何使用 nginx 有条件地欺骗 HTTP 响应?
- javascript - xml 字符串到 xml 解析器:转换 html 字符代码
- sql - 从 SQL 结果中选择一系列结果
- c# - 如何修复 Entity Framework Core 中 X 类型错误的“无法确定导航 X 表示的关系”
- hex - RSA KEY 将十六进制转换为十进制