【问题标题】:SQL Server : error "subquery returned more than 1 value"SQL Server:错误“子查询返回超过 1 个值”
【发布时间】:2019-06-27 01:35:32
【问题描述】:

我插入了一个查询来显示公司每个分支机构的主管、男性和女性员工的总数。但是,我的查询中有一个错误,我不知道如何解决它......请帮助我,提前谢谢。

SELECT  b.brc_id AS 'Branch ID',
        s.stf_first_name AS 'Manager First Name',
        s.stf_last_name AS 'Manager Last Name',
        (SELECT COUNT (sa.stf_position)
         FROM STAFF_T sa, BRANCH_T ba
         WHERE (sa.stf_position = 'Supervisor')
         GROUP BY ba.brc_id, sa.stf_first_name, sa.stf_last_name) AS  
'Number of Supervisor',
        (SELECT COUNT (sb.stf_position)
         FROM STAFF_T sb, BRANCH_T bb
         WHERE (sb.stf_position = 'Staff') AND (sb.stf_gender = 'Male')
         GROUP BY bb.brc_id, sb.stf_first_name, sb.stf_last_name) AS 'Male 
  Staff',
        (SELECT COUNT (sc.stf_position)
         FROM STAFF_T sc, BRANCH_T bc
         WHERE (sc.stf_position = 'Staff') AND (sc.stf_gender = 'Female')
         GROUP BY bc.brc_id, sc.stf_first_name, sc.stf_last_name) AS 
 'Female Staff'
 FROM 
     BRANCH_T b, STAFF_T s
 WHERE 
     (b.brc_id = s.stf_brc_id) AND (b.brc_manager = s.stf_id)
 GROUP BY 
     b.brc_id, s.stf_first_name, s.stf_last_name   

输出应显示公司每个分支机构的主管人数、男性和女性员工总数。但是弹出如下错误信息,

消息 512,第 16 级,状态 1,第 57 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的

【问题讨论】:

  • 请提供样本数据、所需结果和适当的数据库标签。
  • 也应该添加你的shema
  • 我认为它返回多条记录,因为它被分组在一个子查询中。由于它们已经在主查询中分组,因此您不必使用子查询。
  • @mmukai 但是如果我这样做,输出将显示整个数据库的主管,男性和女性员工的总数。我希望它根据分支 ID 显示数字
  • 您可以使用CASE 子句指定条件。 stackoverflow.com/questions/56764963/…这里好像已经有了答案,不过类似的东西也是我的看法。如果没有显示示例数据和您的预期结果,虽然我们可以猜测,但很难回答。

标签: sql-server database subquery


【解决方案1】:

这是因为您的子查询是在原始表上执行的,该表具有多个元组 bc.brc_id、sc.stf_first_name、sc.stf_last_name。如果您想依靠分组数据,请使用 SUM CASE WHEN 或 SUM IIF,如下所示:

SELECT  b.brc_id AS 'Branch ID',
        s.stf_first_name AS 'Manager First Name',
        s.stf_last_name AS 'Manager Last Name',
        SUM(IIF(s.stf_position = 'Supervisor', 1, 0)) AS 
'Number of Supervisor',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Male'), 1, 0)) AS 'Male 
  Staff',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Female'), 1, 0)) AS 'Female Staff'
 FROM 
     BRANCH_T b, STAFF_T s
 WHERE 
     (b.brc_id = s.stf_brc_id) AND (b.brc_manager = s.stf_id)
 GROUP BY 
     b.brc_id, s.stf_first_name, s.stf_last_name   

第二件事,where子句的条件:

AND (b.brc_manager = s.stf_id)

似乎是错误的。在这种情况下,您只能获得每个分支机构的经理。如果你想得到经理的名字,你必须再加入一次STAFF_T。最终查询应该是:

SELECT  b.brc_id AS 'Branch ID',
        m.stf_first_name AS 'Manager First Name',
        m.stf_last_name AS 'Manager Last Name',
        SUM(IIF(s.stf_position = 'Supervisor', 1, 0)) AS 
'Number of Supervisor',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Male'), 1, 0)) AS 'Male 
  Staff',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Female'), 1, 0)) AS 'Female Staff'
 FROM 
     BRANCH_T b
     INNER JOIN STAFF_T s ON b.brc_id = s.stf_brc_id
     LEFT JOIN STAFF_T m ON b.brc_manager = m.stf_id
 GROUP BY 
     b.brc_id, m.stf_first_name, m.stf_last_name   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多