0

我正在尝试构建一个可以在整个系统中使用的视图,该视图返回一个标准化的用户列表及其访问权限。

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 和临时表、游标等,但我希望这可能是一个视图,以便我可以在查询中加入它。这可以做到吗?

多谢你们

4

2 回答 2

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

顺便说一句,这可能是一种观点。

于 2013-06-25T14:22:39.303 回答
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
于 2013-06-25T13:49:24.090 回答