使用sql语句在oracle中的表中查找完全匹配

时间:2015-07-16 06:12:08

标签: sql oracle

我的情况是,只有当传入的参数在表中没有完全匹配时才需要插入记录。 例如, 我有一个角色和一个权限表:

Role:
-------
R1  
R2  
R3  


Permission:
-----------
P1  
P2  
P3  

然后有一个Role_Perm表:

Role|Permission:
----------------
R1 | P1   
R2 | P1  
R2 | P2 
R2 | P3  
R3 | P1
R3 | P3  

现在的问题是,当表中尚未存在权限的确切组合(为新角色提供)时,我想在Role_Perm表中插入新记录; 例如。 'R5 |应插入P1,P2'但是'R5 |不应插入P1,P3'。

我想在执行插入操作之前使用sql查询找到此组合是否已存在。我需要查询帮助。任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

您最初可以使用此查询:

with ins as (select column_value cv from table (sys.odcivarchar2list('P9', 'P1')))
select count(1) cnt 
  from (select listagg(cv, ',') within group (order by cv) list from ins) 
  join (select listagg(permission, ',') 
                       within group (order by permission) list 
          from role_perm group by role) using (list)

SQLFiddle demo

...如果它返回0 - 执行插入。在第一行中放置应该检查的权限。

答案 1 :(得分:0)

首先,这些表未规范化,如果您有权更改表结构,则必须考虑以下内容 01单列(单行)不应具有多个值 02所以你必须使用复合主键创建具有两列Role,Permission的表(使用两列的主键)

然后你不能两次输入两个值 例如: - 我们输入了R2 | P2然后你可以输入R2 | P3但你不能进入R2 | P2

简单的行不能在此结构中重复