TSQL:需要帮助优化这个由两部分组成的记录

时间:2013-06-25 13:35:00

标签: sql-server sql-server-2008 tsql

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

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

谢谢你们

2 个答案:

答案 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

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