Sql where子句中的子查询
下面的代码现在在基于Windows身份验证的视图中工作,用户应该能够看到他们拥有的所有数据以及直接或间接向他们报告的数据。现在,另一个WHERE子句需要处理在Authorize列中提供给用户的额外数据结果 示例数据:表组织结构\u层次结构Sql where子句中的子查询,sql,sql-server,Sql,Sql Server,下面的代码现在在基于Windows身份验证的视图中工作,用户应该能够看到他们拥有的所有数据以及直接或间接向他们报告的数据。现在,另一个WHERE子句需要处理在Authorize列中提供给用户的额外数据结果 示例数据:表组织结构\u层次结构 ManagerID | ManagerEmail | Email | EmployeeID | Authorize | Level ----------------------------------------
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的帮助。我试过了,效果很好。直到你指出,我才意识到拼写错误:。非常感谢你。