Можно написать этот запрос без агрегатной функции? - PullRequest
0 голосов
/ 17 апреля 2019
SELECT l.LocID, COUNT(ulr.UserID)
FROM Locations l
LEFT OUTER JOIN UserLocationRights ulr ON l.LocID = ulr.LocID
LEFT OUTER JOIN Devices d ON l.LocID = d.LocID
LEFT OUTER JOIN UserModelRights umr ON d.ModelName = umr.ModelName
    AND ulr.UserID = umr.UserID
GROUP BY l.LocID, ulr.UserID, d.ModelName
ORDER BY l.LocID, ulr.UserID

Я хочу, чтобы результаты были LocID из всех записей в Locations, а во втором столбце будет количество пользователей, которые имеют права на это местоположение, которые также имеютправа на как минимум один из Devices в Location, который определяется записями в UserModelRights.

Я могу только выяснить, как получить то, что я хочукак это:

SELECT l.LocID, IsNull(UserHasModelRightInLoc.UserCount, 0) UserCount
FROM Locations l
LEFT OUTER JOIN (
    SELECT ulr.LocID, COUNT(UserModelRightsPerLocation.UserID) UserCount
    FROM UserLocRights ulr
    INNER JOIN (
        SELECT l.LocID, umr.UserID
        FROM UserModelRights umr
        INNER JOIN Devices d ON umr.ModelName = d.ModelName
        INNER JOIN Locations l ON d.LocID = l.LocID
        GROUP BY umr.ModelName, umr.UserID, l.LocID
        ) UserModelRightsPerLocation ON ulr.LocID = UserModelRightsPerLocation.LocID
        AND ulr.UserID = UserModelRightsPerLocation.UserID
    GROUP BY ulr.LocID
    ) UserHasModelRightInLoc ON l.LocID = UserHasModelRightInLoc.LocID
ORDER BY l.LocID

Я не знаю, возможно ли это, но я предполагаю , что может быть способ использовать GROUP BY, чтобы получить то, что я хочу, используя мой первыйГораздо меньший запрос.Проблема в том, что я думаю, что мне нужно сделать несколько GROUP BY в определенном порядке, и я не знаю, возможно ли это или имеет смысл в SQL.

Есть ли способ получить желаемый результат безиспользуя агрегатную функцию?Если нет, может быть, сузить его до одного?

1 Ответ

1 голос
/ 17 апреля 2019

Я считаю, что это немного трудно следовать без образцов данных. Но, исходя из вашего описания, это может сделать то, что вы хотите:

SELECT l.LocID, COUNT(DISTINCT ulr.UserID)
FROM Locations l LEFT JOIN
     UserLocationRights ulr
     ON l.LocID = ulr.LocID LEFT JOIN
     Devices d
     ON l.LocID = d.LocID LEFT JOIN
     UserModelRights umr
     ON d.ModelName = umr.ModelName AND
        ulr.UserID = umr.UserID
GROUP BY l.LocID
ORDER BY l.LocID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...