从一个表中选择行,其中映射存在于另一个表中

时间:2015-12-14 02:07:41

标签: sql database oracle oracle11g mapping

我的问题围绕使用Oracle数据库来管理原始权利与商业友好角色之间的映射。

基本上,我有两张桌子:

映射表 - 这将包含适合特定应用程序所需的权利。请注意,您必须具有特定应用程序的所有权利才能拥有它。此外,这可能会在任何一天发生变化,因此查询需要是动态的,因为它可能是3个权利=一个角色或10个权利=一个角色。

           
Application ApplicationRole     Resource    Action
--------------------------------------------------------
Test1       Admin               appserver1  admin
Test1       Admin               appserver2  admin
Test1       Admin               appserver3  admin
test2       ReadOnly            appserver1  ro
test2       ReadOnly            appserver2  ro

帐户表 - 此表将包含来自服务器的原始数据,例如哪些服务器上存在哪些帐户:

Account Resource    Action      Application
-------------------------------------------------
abc123  appserver1  admin       Test1
abc123  appserver2  admin       Test1
abc123  appserver3  admin       Test1
test2   ReadOnly    appserver1  ro

我的目标是找到适用于我的帐户的approro(业务友好分组)。在此示例中,帐户abc123有3个权利,适用于应用程序服务器1,2和3,并具有管理员权限。看一下映射表,我现在可以说这个帐户有applicationrole" admin"。但是,帐户test2只在单个服务器上运行,并且映射表明它需要在两个服务器上运行才能拥有角色" ReadOnly"因此,帐户test2没有角色。

查询对此相同数据的输出应如下所示:

Account   Application   ApplicationRole
----------------------------------------------
abc123    Test1         Admin

稍后,我还想要一个返回相反的查询;所有不适合角色的帐户。 E.g。

Account   Application   Resource    Action
----------------------------------------------
test2     test2         ReadOnly    appserver1

如果我能提供更多信息,请告诉我!我无法在网上找到自己的东西,似乎很难找到。

谢谢你们! :)

修改 我设法编写了这个查询,它似乎适用于第一部分;不确定它是不是最好的方式,任何指导都会很棒:)

SELECT *
FROM TEMP_USERDATA b
LEFT JOIN TEMP_MAPPINGTABLE a
ON a.application = b.application
AND a.oresource  =b.oresource
AND a.action     =b.action
WHERE (SELECT COUNT(c.application||c.oresource||c.action)
  FROM temp_mappingtable c
  WHERE c.application=a.application) =
  (SELECT COUNT(DISTINCT application||oresource||action||account)
  FROM temp_userdata
  WHERE temp_userdata.application=a.application
  );

1 个答案:

答案 0 :(得分:0)

试试这个:

;WITH mapingdata AS (  SELECT application,
applicationrole,
resource,
action,
COUNT ( * ) AS rowcount
FROM    temp_mappingtable
GROUP BY application,
applicationrole,
resource,
action),

WITH userdata AS (  SELECT   account,
                                      resource,
                                      action,
                                      application,
                                      COUNT ( * ) AS rowcount
                             FROM   user_data
                        GROUP BY   account,
                                      resource,
                                      action,
                                      application)
SELECT  *
  FROM  mapingdata m, userdata u
 WHERE       m.application = u.application
            AND m.resource = u.resource
            AND m.action = u.action
            AND m.rowcount = u.rowcount;