我正在尝试构建一个可以在整个系统中使用的视图,该视图返回标准化的用户列表及其访问权限。
Table: Users
UserID UserName IsAdmin
----------------------------------
1 John 0
2 Jane 1
3 Mary 0
Table: Clients
ClientID ParentClientID ClientName
----------------------------------
1 NULL Pepsico
2 1 Pizza Hut
3 1 Taco Bell
4 1 KFC
5 NULL McDonalds
Table: UsersInClients
UserID ClientID
----------------------------------
1 2
1 3
2 1
3 5
我想要的输出:
UserID ClientID
----------------------------------
1 2 --User 1 & 3 are not admins so list only includes IDs in UsersInClients table.
1 3
2 1 --If Users.IsAdmin = 1, it should return
2 2 --all parent client and all child clients,
2 3 --one row per client like this.
2 4
3 5
我能想到这样做的唯一方法是使用CTE和临时表,游标等,但我希望这可以是一个视图,所以我可以在我的查询中加入它。可以这样做吗?
谢谢你们
答案 0 :(得分:0)
您可以通过以下方式执行此操作,使用两个查询的UNION。
(可能有一种方法可以在一个JOIN条件下完成所有操作,但这更容易调试。)
SELECT UserId, ClientID
FROM UsersInClients Uic INNER JOIN Users U ON Uic.UserId = U.UserID
INNER JOIN Clients C ON (C.ClientID = Uic.ClientID OR C.ParentClientID = Uic.ClientID)
WHERE U.IsAdmin = 1
UNION ALL
SELECT UserId, ClientID
FROM UsersInClients Uic INNER JOIN Users U ON UIC.UserId = U.UserID
INNER JOIN Clients C ON C.ClientID = Uic.ClientID
WHERE U.IsAdmin = 0
答案 1 :(得分:0)
如果你有一个无界的层次结构,那么你的解决方案就是CTE。
WITH T AS
(
SELECT UC.UserId, UC.ClientId, U.IsAdmin
FROM UsersInClient UC
INNER JOIN Users U
ON UC.UserId = U.UserId
UNION ALL
SELECT T.UserId, C.ClientId, T.IsAdmin
FROM T
INNER JOIN Clients C
ON T.ClientId = C.ParentClientId AND T.IsAdmin = 1
)
SELECT * FROM T
顺便说一句,这可能是一种观点。