首页 > 解决方案 > 聚合子查询

问题描述

我很难找出如何从员工最多的表中获取项目编号或项目名称

create table Pro_works_on
(
    EID char(9) ,
    PNO char(9) ,
    Pro_HOURS smallint not null,
    constraint pk_Pro_works_on primary key(EID,PNO),
);

SELECT
  p.PNO
FROM
  Pro_works_on AS p
 ,(
    SELECT
      COUNT(p.EID) AS numOfEmployee
     ,p.PNO
    FROM
      Pro_works_on AS p
    GROUP BY
      p.PNO
  ) AS L
WHERE
  MAX(L.numOfEmployee) = COUNT(p.EID);

它产生以下错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

标签: sqlsql-serversql-server-2017

解决方案


使用order by和某种限制条款——如果你想要一行。在标准 SQL 中:

select p.PNO, count(*) as numOfEmployee 
from Pro_works_on p
group by p.PNO
order by count(*) desc
fetch first 1 row only;

在 SQL Server 中,您可以将top (1) ortop (1) 与 ties` 一起使用:

select top (1) p.PNO, count(*) as numOfEmployee 
from Pro_works_on p
group by p.PNO
order by count(*) desc;

推荐阅读