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.
Есть ли способ получить желаемый результат безиспользуя агрегатную функцию?Если нет, может быть, сузить его до одного?