DECLARE @USERID INT = 1,
@GRANTED_BY_DEFAULT INT = 0,
@RESULTING_RIGHTS VARCHAR(20) = 'MIN_RIGHTS',
@RIGHTS_PRIORITY VARCHAR(20) = 'USER_OVER_GROUP'
SELECT
R.ID,
R.NAME,
CASE
WHEN MAX(UR.Value) IS NULL AND MAX(GR.Value) IS NULL THEN
@GRANTED_BY_DEFAULT
WHEN MAX(UR.Value) IS NOT NULL AND MAX(GR.Value) IS NOT NULL THEN
CASE
WHEN @RIGHTS_PRIORITY = 'USER_OVER_GROUP' THEN
MAX(UR.Value)
ELSE
CASE
WHEN @RESULTING_RIGHTS = 'MIN_RIGHTS' THEN
MIN(GR.Value)
ELSE
MAX(GR.Value)
END
END
WHEN MAX(GR.Value) IS NULL THEN
MAX(UR.Value)
ELSE
CASE
WHEN @RESULTING_RIGHTS = 'MIN_RIGHTS' THEN
MIN(GR.Value)
ELSE
MAX(GR.Value)
END
END VALUE
FROM
[Right] R
CROSS JOIN [User] U
LEFT JOIN [User_Right] UR
ON R.ID = UR.RightID
AND UR.UserID = U.ID
LEFT JOIN [User_Group] UG
ON UG.UserID = U.ID
LEFT JOIN [Group_Right] GR
ON UG.GroupID = GR.GroupID
AND GR.RightID = R.ID
WHERE
U.ID = @USERID
GROUP BY
R.ID,
R.NAME
Here is a SQL fiddle example SQL Fiddle