我可以在子查询中使用多个列吗?
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
)
我可以在那个子查询中同时拥有PersonID
、COUNT(*)
,还是必须只有一列?
【问题讨论】:
【参考方案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 可能会为您提供更优化的查询计划。以上是关于我可以在子查询中使用多个列吗?的主要内容,如果未能解决你的问题,请参考以下文章