【问题标题】: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(*),还是必须只有一列?

【问题讨论】:

    标签: sql sql-subselect


    【解决方案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 可能会为您提供更优化的查询计划。
    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多