首页 > 解决方案 > 进行正确的连接和使用 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

有了这个查询,我在我想要的表中有两个第一列,但是在添加第三个时遇到了麻烦......有什么想法吗?

标签: sql-server

解决方案


认为这应该做你所追求的

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 表。


推荐阅读