3 tables are defined as follows:
Users
User_ID INT
First_Name VARCHAR
Last_Name VARCHAR
Email VARCHAR
Roles
Role_ID INT
Role_Name VARCHAR
Access_Level INT
Roles_Users
User_ID INT
Role_ID INT
Roles_Users is a many-to-many linking table between Users and Roles. I want to pull back the following info:
First_Name, Last_Name, Email, Role_Name
What I have so far is:
SELECT
U.First_Name,
U.Last_Name,
U.Email,
R.Name AS Role_Name
FROM Users U
INNER JOIN Roles_Users RU ON U.User_ID = RU.User_ID
INNER JOIN Roles R ON RU.Role_ID = R.Role_ID
The tricky part (at least for me) is that I want to only pull back the Role_Name with the MIN(Access_Level) for that particular user. So basically the record set I want to pull will have each user only listed once with their lowest access level role name.
I’m sure this is pretty simple but it’s just stumping me right now.
Thanks
YOu can use a CTE (Common Table Expression) in conjunction with the
ROW_NUMBERwindowing function like this:The CTE “partitions” your data by
User_ID, e.g. each user gets a “partition”. Inside that partition, the roles are ordered byAccess_leveland the smallest is the first one – so it getsRowNum = 1– for each user.So you then select from that CTE all those entries where the
RowNum = 1– this delivers all the entries for each user which have the smallestAccess_Levelvalue.