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

Posted

技术标签:

【中文标题】我可以在子查询中使用多个列吗?【英文标题】:Can I use more than one column in subquery? 【发布时间】:2012-09-20 23:08:00 【问题描述】:

我想显示EMPLOYEES 表中从事PROJECT 表中三个以上项目的所有员工的姓名。

PROJECTS.PersonID 是一个引用 EMPLOYEES.ID 的外键:

SELECT NAME, ID 
FROM EMPLOYEES
WHERE ID IN
    ( 
    SELECT PersonID, COUNT(*)
    FROM PROJECTS
    GROUP BY PersonID
    HAVING COUNT(*) > 3
    )

我可以在那个子查询中同时拥有PersonIDCOUNT(*),还是必须只有一列?

【问题讨论】:

【参考方案1】:

不在IN 子句中(或者至少不是您尝试使用它的方式。一些RDBMS 允许在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 中使用的所有东西也包括在 Select 中:) 非常感谢!【参考方案2】:

要回答您的问题,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,出于某种原因,我真的更喜欢子查询而不是连接 :) 为什么加入 LEFT 而不是 INNER 在收集样本数据时不习惯...,INNER JOIN 可能会为您提供更优化的查询计划。

以上是关于我可以在子查询中使用多个列吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

如何在子查询 SQL Server 中选择多个项目

MSSQL 2012 - 在子查询中返回多个列

在子查询中使用聚合和窗口函数

我应该在子查询中使用 Top(1)

5. SQL子查询—内嵌的SQL子句