首页 > 解决方案 > 子查询错误返回超过 1 个值

问题描述

以下是我尝试执行并收到错误的查询。这是原始错误

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

作为 user1@abc.com,我想查看人们直接向我报告的所有记录以及直接向我下属的人报告的记录。根据我想查看 EmployeeID 273、16、274、285、286、275、276、23 的数据。

获取所有 >= 到 user1@abc.com 级别的记录的目标。下面是当前表中数据的样子。TOrganization_Hierarchy

select A.ManagerID, A.ManagerEmail, A.Email, A.EmployeeID, A.Title, A.DeptID, A.Level
from TOrganization_Hierarchy A
where  A.ManagerEmail = 'user1@abc.com'
and A.Level >= (select B.Level
            from TOrganization_Hierarchy B
            where  B.ManagerEmail = A.ManagerEmail) ;

大家好,我已经弄清楚了,下面是运行的代码

WITH CTE 
     AS (SELECT OH.employeeid, 
                OH.managerid, 
                OH.email AS EMPEMAIL, 
                1        AS level 
         FROM   TORGANIZATION_HIERARCHY OH 
         WHERE  OH.[email] = user1@abc.com
         UNION ALL 
         SELECT CHIL.employeeid, 
                CHIL.managerid, 
                CHIL.email, 
                level + 1 
         FROM   TORGANIZATION_HIERARCHY CHIL 
                JOIN CTE PARENT 
                  ON CHIL.[managerid] = PARENT.[employeeid]), 
     ANOTHERCTE 
     AS (SELECT   
        T.[email], 
        T.[destination_account], 
        T.[customer_service_rep_code] 
         FROM   [KGFGJK].[DBO].[TRANS] AS T) 
SELECT * 
FROM   ANOTHERCTE 
       INNER JOIN CTE 
               ON CTE.empemail = ANOTHERCTE.[email]; 

标签: sqlsql-server

解决方案


像这样的比较=, !=, <>, <, <= , >, >=只需要比较 1 个值。
因此,具有多条记录的结果会导致错误。

EXISTS但是可以为此使用一个。

...
WHERE A.ManagerEmail = 'user1@abc.com'
AND EXISTS
(
  SELECT 1
  FROM TOrganization_Hierarchy B
  WHERE B.ManagerEmail = A.ManagerEmail
    AND B.Level <= A.Level
)

顺便说一句,查看数据,匹配相同的 ManagerID 可能更有效。

...
WHERE A.ManagerEmail = 'user1@abc.com'
AND EXISTS
(
  SELECT 1
  FROM TOrganization_Hierarchy B
  WHERE B.ManagerID = A.ManagerID
    AND B.Level <= A.Level
)

推荐阅读