在以下查询中需要帮助: 我的要求是,如果在si_org_roles(第一个联合)中为用户存在role_id,则无需从审计表中获取数据 (用于从角色中删除的用户列表)并注意用户可以拥有多个组织角色,即。角色扮演角色是多方面的关系。
SELECT m.user_id, m.org_role_id, m.last_update_date,ro.role_id
FROM si_user_org_roles m,si_org_roles ro where m.org_role_id = ro.org_role_id
and ro.role_id = 100074
union
SELECT au.user_id_o,
au.org_role_id_o,
au.last_update_date_o,
ru.role_id
FROM si_user_org_roles_au au,si_org_roles ru
WHERE au.transaction_type = 'Delete'
and au.org_role_id_o = ru.org_role_id
答案 0 :(得分:2)
这个怎么样:
SELECT m.user_id,
m.org_role_id,
m.last_update_date,
ro.role_id
FROM si_user_org_roles m,
si_org_roles ro
where m.org_role_id = ro.org_role_id
and ro.role_id = 100074
union
SELECT au.user_id_o,
au.org_role_id_o,
au.last_update_date_o,
ru.role_id
FROM si_user_org_roles_au au,si_org_roles ru
WHERE au.transaction_type = 'Delete'
and au.org_role_id_o = ru.org_role_id
and not exists(select 'X'
from si_user_org_roles m,
si_org_roles ro
where m.org_role_id = ro.org_role_id
and ro.org_role_id = ru.org_role_id
and ro.role_id = 100074)
完全未经测试,因为您没有提供表格定义或样本数据。
这里的想法是前半部分(在union之前)基于role_id进行选择,如果没有可用数据,则第一个查询将不返回任何行。然后下半部分(在联合之后)追踪审计数据,但是,我添加了exists子句。 exists子句基本上检查前半部分是否返回数据,如果是,则阻止后半部分返回数据。
希望这是有道理的。
答案 1 :(得分:0)
您可以使用NOT EXISTS
子句跳过审计表中的选择。
NOT EXISTS (SELECT role_id
FROM si_org_roles
WHERE role_id = 100074); -- to check the role_id is avlailable in si_org_roles table.
试试这个,
SELECT m.user_id, m.org_role_id, m.last_update_date,ro.role_id
FROM si_user_org_roles m,
si_org_roles ro
WHERE m.org_role_id = ro.org_role_id
AND ro.role_id = 100074
UNION
SELECT au.user_id_o, au.org_role_id_o, au.last_update_date_o, ru.role_id
FROM si_user_org_roles_au au,
si_org_roles ru
WHERE au.transaction_type = 'Delete'
AND au.org_role_id_o = ru.org_role_id
AND NOT EXISTS (SELECT role_id
FROM si_org_roles
WHERE role_id = 100074);