Как оптимизировать мой запрос с помощью CTE и объединений - PullRequest
0 голосов
/ 13 мая 2019

В моем запросе есть CTE для ранжирования ролей для каждого пользователя.Вторая часть выбирает всех пользователей и объединяет каждую роль в новый столбец.

CTE объединяется на основе идентификатора, для выполнения запроса требуется вечность.

Любой совет с благодарностью!

WITH UserRoles AS
(
    SELECT 
        ru.ID,
        ru.EmailAddress,
        r.RoleName,
        RANK() OVER (PARTITION BY IdentityUserID ORDER BY UserRoleName) AS RoleNumber
    FROM
        Users ru
    LEFT JOIN 
        User_Role r ON r.UserRoleID = ru.UserRoleID
    WHERE
        ru.UserID IS NOT NULL
)
SELECT
    l.[LastName],
    l.[FirstName],
    (SELECT TOP 1 RoleName 
     FROM UserRoles 
     WHERE UserRoles.ID = l.ID AND RoleNumber = 1) AS Role1,
    (SELECT TOP 1 RoleName 
     FROM UserRoles 
     WHERE UserRoles.ID = l.ID AND RoleNumber = 2) AS Role2,
    (SELECT TOP 1 RoleName 
     FROM UserRoles 
     WHERE UserRoles.ID = l.ID AND RoleNumber = 3) AS Role3,
    (SELECT TOP 1 RoleName 
     FROM UserRoles 
     WHERE UserRoles.ID = l.ID AND RoleNumber = 4) AS Role4,
    (SELECT TOP 1 RoleName 
     FROM UserRoles 
     WHERE UserRoles.ID = l.ID AND RoleNumber = 5) AS Role5
FROM 
    [dbo].[UserLogins] l
WHERE
    (SELECT TOP 1 UserRoleName 
     FROM UserRoles 
     WHERE UserRoles.ID = l.ID AND RoleNum = 1) IS NOT NULL

1 Ответ

1 голос
/ 13 мая 2019

Используйте JOIN s и GROUP BY вместо подзапросов. Я думаю, это то, что вы хотите:

SELECT l.LastName, l.FirstName,
       MAX(CASE WHEN seqnum = 1 THEN RoleName END) as Role1,
       MAX(CASE WHEN seqnum = 2 THEN RoleName END) as Role2,
       MAX(CASE WHEN seqnum = 3 THEN RoleName END) as Role3,
       MAX(CASE WHEN seqnum = 4 THEN RoleName END) as Role4,
       MAX(CASE WHEN seqnum = 5 THEN RoleName END) as Role5
FROM (SELECT l.LastName, l.FirstName, u.ID, u.EmailAddress, r.RoleName,
             row_number() over (partition by IdentityUserID order by UserRoleName) AS seqnum
      FROM Users u JOIN
           User_Role ur
           ON u.UserRoleID = ur.UserRoleID JOIN
           UserLogins ul
           ON ur.id = ul.id
      WHERE u.UserID is not null
     ) r
GROUP BY LastName, FirstName;
...