我有一个系统,其中有多个角色的用户,有些人可以有多达5个不同的角色分配给他们,我想建立一个查询,我可以显示用户名,如果他们有一个特定的角色,然后也如果他们有第二个特定的角色。如果它们都有,那么两个都将被填充,但是如果它们只有第一个角色,那么第二列将显示为空白。
我知道我下面有什么是错误的,因为它只会显示用户,如果他们有两个角色,但是否有可能输入一个if语句或类似的,即第二个角色列将显示第二个角色,或者如果没有其他角色被分配或任何其他角色被分配,它显示一个空值?
SELECT USERS.USER_NAME, USER_ROLE.USER_ROLE, USER_ROLE_1.USER_ROLE
FROM SYSTEM.USERS USERS, SYSTEM.USER_ROLE USER_ROLE, SYSTEM.USER_ROLE USER_ROLE_1
WHERE USERS.USER_NAME = USER_ROLE_1.USER_NAME AND USERS.USER_NAME = USER_ROLE.USER_NAME
AND ((USER_ROLE.USER_ROLE = 'MASTER') AND (USER_ROLE_1.USER_ROLE='ADMIN'))
我也不想要重复的,这就是为什么我没有尝试一些显示用户,如果他们有角色1或角色1和角色2等如下
SELECT USERS.USER_NAME, USER_ROLE.USER_ROLE, USER_ROLE_1.USER_ROLE
FROM SYSTEM.USERS USERS, SYSTEM.USER_ROLE USER_ROLE, SYSTEM.USER_ROLE USER_ROLE_1
WHERE USERS.USER_NAME = USER_ROLE_1.USER_NAME AND USERS.USER_NAME = USER_ROLE.USER_NAME AND (((USER_ROLE.USER_ROLE = 'MASTER') AND (USER_ROLE_1.USER_ROLE='ADMIN')) OR (USER_ROLE.USER_ROLE = 'MASTER'))
您应该了解更多关于连接的知识。您的语法可能适合您,但是您编写的格式使其难以分析。试试这样做:
SELECT USERS.USER_NAME
,USER_ROLE.USER_ROLE
,USER_ROLE_1.USER_ROLE
FROM SYSTEM.USERS USERS
INNER JOIN SYSTEM.USER_ROLE USER_ROLE
ON USERS.USER_NAME = USER_ROLE.USER_NAME
LEFT OUTER JOIN SYSTEM.USER_ROLE USER_ROLE_1
ON USERS.USER_NAME = USER_ROLE_1.USER_NAME
WHERE (((USER_ROLE.USER_ROLE = 'MASTER')
AND (USER_ROLE_1.USER_ROLE='ADMIN')
)
OR (USER_ROLE.USER_ROLE = 'MASTER')
)
我不知道这里的数据是什么样子的,但是我列出的如何用'ON'子句编写连接的方式应该会对您有所帮助。正如@Andrew所指出的,LEFT OUTER JOIN似乎适合于可能在每个记录中都没有匹配值的表。您仍然会从其他表中输出记录,不匹配的字段显示为'NULL'。
尝试如下:
SELECT
USERS.USER_NAME,
RoleQ.FirstRole,
(CASE WHEN RoleQ.FirstRole IS NULL THEN RoleQ.SecondRole ELSE NULL END) AS SecondRole
FROM SYSTEM.USERS USERS
LEFT JOIN
(
SELECT
USER_NAME,
MAX(CASE WHEN USER_ROLE = 'MASTER' THEN USER_ROLE ELSE NULL END) AS FirstRole,
MAX(CASE WHEN USER_ROLE = 'ADMIN' THEN USER_ROLE ELSE NULL END) AS SecondRole
FROM SYSTEM.USER_ROLE
GROUP BY USER_NAME
) AS RoleQ ON USERS.USER_NAME = RoleQ.USER_NAME