我可以在子查询中使用多个列吗?

3
我希望能够显示来自EMPLOYEES表中参与了三个以上项目的所有员工的姓名。 PROJECTS.PersonID是一个外键,引用了EMPLOYEES.ID
SELECT NAME, ID 
FROM EMPLOYEES
WHERE ID IN
    ( 
    SELECT PersonID, COUNT(*)
    FROM PROJECTS
    GROUP BY PersonID
    HAVING COUNT(*) > 3
    )

我能否在子查询中同时包含PersonIDCOUNT(*),还是只能有一个列?

2个回答

6

你不能在一个 IN 子句中使用这种方式(或者至少不是你现在尝试的方式。一些关系型数据库允许在 IN 子句中使用具有多个列的元组,但这对你的情况没有帮助)

你只需要从 SELECT 列表中删除 COUNT(*) 就可以达到你想要的结果。

SELECT NAME, ID 
FROM EMPLOYEES
WHERE ID IN
    ( 
    SELECT PersonID
    FROM PROJECTS
    GROUP BY PersonID
    HAVING COUNT(*) > 3
    )
如果您想要返回计数,您可以连接到一个包含多个列的派生表或公共表达式。
SELECT E.NAME,
       E.ID,
       P.Cnt
FROM   EMPLOYEES E
       JOIN (SELECT PersonID,
                    Count(*) AS Cnt
             FROM   PROJECTS
             GROUP  BY PersonID
             HAVING Count(*) > 3) P
         ON E.ID = P.PersonID

有道理!哦,我以为在选择中也必须包括在Group By/Having中使用的所有内容 :) 非常感谢! - IanDess

1
回答您的问题,IN子查询只能有1列。您可以使用以下查询获取结果:
SELECT e.ID
      ,e.Name 
FROM dbo.Projects p
LEFT OUTER JOIN dbo.Employees e
    ON p.PersonID = e.ID
GROUP BY e.ID
        ,e.Name 
HAVING COUNT(*) > 3

是的,谢谢,那可能是更好的解决方案!我正在为我的大学考试学习SQL,但出于某种原因,我真的更喜欢子查询而不是连接 :) - IanDess
为什么要使用LEFT连接而不是INNER连接? - ypercubeᵀᴹ
出于惯性,在收集样本数据时,使用INNER JOIN 可能会为您带来更优化的查询计划。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,