0

我正在尝试从视图中获取父部门的记录PayrollView以及提供的子部门的记录DepartmentSecurityMode=2。这些行是根据父部门 ID 过滤的。这是我尝试过的,但它向我显示了错误

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

DECLARE @LoggedInUserId   UNIQUEIDENTIFIER
                         = 'ff333441-bc4f-4f3d-b992-aad17baa9ebc'
DECLARE @LoggedInRoleId   UNIQUEIDENTIFIER
                         = '2cb31771-7cbc-4f38-b558-804308d908c7'
DECLARE @DepartmentId   UNIQUEIDENTIFIER
                       = '989fd98a-33ae-4ce1-8bbd-ed51ac46137d'
DECLARE @PeriodId   UNIQUEIDENTIFIER = 'e7e52d21-90ad-4f2d-adc2-3f5399a032dd'

SELECT *
FROM PayrollView pv
INNER JOIN Departments d
ON pv.DepartmentId = d.SysId
CROSS JOIN AppRoles r
LEFT JOIN UserDepartmentView rd
ON d.SysId = rd.DepartmentId
AND rd.RoleId = @LoggedInRoleId
AND rd.UserId = @LoggedInUserId
WHERE PeriodId = @PeriodId
AND r.SysId = @LoggedInRoleId
AND 
(
    r.DepartmentSecurityMode = 2
    AND D.SysId IN
    ( 
        (
            SELECT SysId
            FROM Departments ds
            WHERE ds.ParentHierarchy LIKE
             '%' + cast (@DepartmentId AS VARCHAR (50)) + '%'
        )
        ,
        --This is where I want to combine both the child as well the parent.
        (
            CASE
                WHEN @DepartmentId = '00000000-0000-0000-0000-000000000000' THEN D.SysId
                ELSE @DepartmentId
            END
        )
    )
)

非常感谢任何建议。

4

2 回答 2

1

您正在尝试一些奇怪的事情:使用条件<expression> IN (...)您可以过滤项目列表中存在的记录。该列表可以是由逗号或子查询分隔的值。您正在将两者结合起来(据我所知)这是不可能的。

所以你必须将这两种技术分开......

更新:

@JohnLBevan 的答案是一个选项,但我认为您可以通过这样做来简化逻辑:

AND (
      -- don't filter if no department provided 
      @DepartmentId = '00000000-0000-0000-0000-000000000000'

      OR 

      -- filter on the given department
      D.SysId IN ( 
                    SELECT SysId
                    FROM Departments ds
                    WHERE ds.ParentHierarchy LIKE '%' + cast (@DepartmentId AS 
VARCHAR (50)) + '%'
                  )
)
于 2018-11-08T11:17:42.653 回答
0

我不完全理解您的要求,但正如@Johey在他的回答中指出的那样,您的IN陈述存在问题。尝试用此代码替换逻辑D.SysId in/让我们知道这是否符合您的期望...

AND D.SysId IN
( 
    SELECT SysId
    FROM Departments ds
    WHERE ds.ParentHierarchy LIKE '%' + cast (@DepartmentId AS VARCHAR (50)) + '%'

    UNION

    SELECT CASE
        WHEN @DepartmentId = '00000000-0000-0000-0000-000000000000' THEN D.SysId
        ELSE @DepartmentId
    END
)
于 2018-11-08T11:56:53.150 回答