Sql where子句中的子查询

Sql where子句中的子查询,sql,sql-server,Sql,Sql Server,下面的代码现在在基于Windows身份验证的视图中工作,用户应该能够看到他们拥有的所有数据以及直接或间接向他们报告的数据。现在,另一个WHERE子句需要处理在Authorize列中提供给用户的额外数据结果 示例数据:表组织结构\u层次结构 ManagerID | ManagerEmail | Email | EmployeeID | Authorize | Level ----------------------------------------

下面的代码现在在基于Windows身份验证的视图中工作,用户应该能够看到他们拥有的所有数据以及直接或间接向他们报告的数据。现在,另一个WHERE子句需要处理在Authorize列中提供给用户的额外数据结果

示例数据:表组织结构\u层次结构

    ManagerID | ManagerEmail    | Email             | EmployeeID | Authorize |  Level
    ---------------------------------------------------------------------------------
    NULL      | NULL            | user0@@abc.com    | 1     | NULL           |  0
    1         | user0@@abc.com  | user1@@abc.com    | 273   | NULL           |  1
    273       | user1@@abc.com  | user2@@abc.com    | 16    | NULL           |  2
    273       | user1@@abc.com  | SJiang@@abc.com   | 274   | NULL           |  2
    273       | user1@@abc.com  | SAbbas@abc.com    | 285   | user2@@abc.com; user3@abc.com |  2
    285       | SAbbas@abc.com  | LTsoflias@abc.com | 286   | NULL           |  3
    274       | SJiang@@abc.com | MBlythe@abc.com   | 275   | NULL           |  3
    274       | SJiang@@abc.com | LMitchell@abc.com | 276   | NULL           |  3
    16        | JWhite@abc.com  | user3@abc.com     | 23    | NULL           |  3
示例数据:表TRANS

    Email             | Destination_account      | Customer_service_rep_code   
    -----------------------------------------------------------
    SAbbas@abc.com    |   Philippines            | 12646
    Junerk@abc.com    |   Canada                 | 95862
    LTsoflias@abc.com |   Italy                  | 98524
    user2@@abc.com    |   Italy                  | 29185
    user3@@abc.com    |   Brazil                 | 58722
当用户SAbbas@abc.com285登录。它可以查看EmployeeID285和286的所有数据。我需要为该用户添加另一个where语句SAbbas@abc.com授权查看在“授权”列中查看。所以结果是用户SAbbas@abc.com应查看员工ID 285、286、16、23

WITH CTE 
 AS (SELECT OH.employeeid, 
            OH.managerid, 
            OH.email AS EMPEMAIL, 
            1        AS level 
     FROM   TORGANIZATION_HIERARCHY OH 
     WHERE  OH.[email] = (SELECT SYSTEM_USER)  --Example SAbbas@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]; 

这将根据列授权为您提供所需的内容。结果应该是16和23

Select b.employeeid from TORGANIZATION_HIERARCHY a inner join TORGANIZATION_HIERARCHY b
on a.Authorize like  '%' + b.Email + '%'
where a.Email = 'SAbbas@abc.com'
让我知道

完整解决方案:

让你能看到user3@abc.com,我必须更正表6中的电子邮件。你在那里工作user3@@abc.com而不是user3@abc.com. @ 而不是。 下面是测试代码。之后,可以用表名替换

IF OBJECT_ID('tempdb..#TORGANIZATION_HIERARCHY') IS NOT NULL DROP TABLE #TORGANIZATION_HIERARCHY;   


    select  NULL  as ManagerID    ,NULL as ManagerEmail           ,'user0@@abc.com'  as Email  ,1 as EmployeeID    ,NULL    as Authorize       , 0 as Level into #TORGANIZATION_HIERARCHY
    union select    1         ,'user0@@abc.com',  'user1@@abc.com'    ,273   ,NULL           , 1
    union select    273       ,'user1@@abc.com',  'user2@@abc.com'    ,16    ,NULL           , 2
    union select    273       ,'user1@@abc.com',  'SJiang@@abc.com'   ,274   ,NULL           , 2
    union select    273       ,'user1@@abc.com',  'SAbbas@abc.com'    ,285   ,'user2@@abc.com; user3@abc.com' , 2
    union select    285       ,'SAbbas@abc.com',  'LTsoflias@abc.com' ,286   ,NULL           , 3
    union select    274       ,'SJiang@@abc.com', 'MBlythe@abc.com'   ,275   ,NULL           , 3
    union select    274       ,'SJiang@@abc.com', 'LMitchell@abc.com' ,276   ,NULL           , 3
    union select    16        ,'JWhite@abc.com',  'user3@abc.com'  ,23    ,NULL           , 3

    --select * from #TORGANIZATION_HIERARCHY

IF OBJECT_ID('tempdb..#TRANS') IS NOT NULL DROP TABLE #TRANS;   

    select 'SAbbas@abc.com'  as Email ,    'Philippines'  as Destination_account         ,  12646 as Customer_service_rep_code into #TRANS
    union select 'Junerk@abc.com'   ,    'Canada'                ,  95862
    union select 'LTsoflias@abc.com',    'Italy'                 ,  98524
    union select 'user2@@abc.com'   ,    'Italy'                 ,  29185
    union select 'user3@abc.com'   ,    'Brazil'                ,  58722

    ;WITH CTE 
     AS (SELECT OH.employeeid, 
                OH.managerid, 
                OH.Authorize, 
                OH.email AS EMPEMAIL, 
                1        AS [level] 
         FROM   #TORGANIZATION_HIERARCHY OH 
         WHERE  OH.[email] = (SELECT 'SAbbas@abc.com')  --Example
         UNION ALL 
         SELECT CHIL.employeeid, 
                CHIL.managerid, 
                CHIL.Authorize, 
                CHIL.email, 
                CHIL.[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   #TRANS AS T) 

       SELECT *
       FROM   ANOTHERCTE 
       RIGHT JOIN 
       (
            select a.EmployeeID, a.ManagerID, a.Authorize, a.Email as empemail, a.[level] From CTE INNER JOIN #TORGANIZATION_HIERARCHY a on lower(CTE.Authorize) like  '%' + lower(a.Email) + '%'
            union
            select * From CTE 
       ) CTE
               ON CTE.empemail = ANOTHERCTE.[email]
    order by [level]
输出:


我不知道你的问题是什么。@newbie,我在表中看不到什么可以让SAbbas看到员工285286 16 23的数据?多一点信息会有助于回答你的问题,但如果你的问题不多,就会令人困惑。员工16和23没有提及授权栏或其中的电子邮件。您是否混淆了员工ID和经理ID?。为什么不为或Authorize=SELECT From SYSTEM\u USER添加或条件呢。我再次假设。不知道你想要什么…@zip我已经添加了另一个表名TRANS,我希望这对我的问题有帮助。同样,如果用户SAbbas@abc.com登录时,他应该会看到TRANS中的两条记录表1是他的SAbbas@abc.com及其他LTsoflias@abc.com那份报告交给了他。我还希望他在TRANS表中看到更多的记录,他允许在表TorOrganization\u层次结构的Authorize列中看到,这是我无法让它工作的地方。我希望这个问题现在更清楚了。@Matt,请看上面的评论。感谢您的建议,我在原始查询中添加了代码,请参见下文,但仍然只能获得SAbbas@abc.com和LTsoflias@abc.comTRANS表中的记录。我希望获得与电子邮件地址相关的记录SAbbas@abc.com, LTsoflias@abc.com,user2@@abc.com和user3@abc.com从TRANS表中。将CTE设置为SELECT OH.employeeid,OH.managerid,OH.email设置为EMPEMAIL,1设置为OH上的TorOrganization\u HIERARCHY OH Internal JOIN TorOrganization\u HIERARCHY B的级别,如“%”+B.email+“%”,其中OH.[email]='SAbbas@abc.com“所有工会选择儿童雇员ID…………嗨@Newbie,我已经发布了完整的解决方案供您查看,结果是285、286、16和23。希望对您有所帮助谢谢@zip的帮助。我试过了,效果很好。直到你指出,我才意识到拼写错误:。非常感谢你。