需要有关查询的帮助以从Oracle中的两个表的并集中选择数据

时间:2013-11-21 07:54:56

标签: sql oracle oracle11g

在以下查询中需要帮助: 我的要求是,如果在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

2 个答案:

答案 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);