【问题标题】:Find exact match in a table in oracle using sql statements使用 sql 语句在 oracle 中的表中查找完全匹配
【发布时间】:2015-07-16 15:57:24
【问题描述】:

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

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 查询来查找此组合是否已存在。我需要查询方面的帮助。非常感谢任何帮助。

【问题讨论】:

  • 您是否有权更改您的表结构?特别是对于 Role_Perimission。您应该将其用作多对多关系的桥接表。
  • Role_perm 表未规范化。您需要将其设为查找表。
  • 公平地说,连接(多对多)表本身并不能解决 OP 的实际问题。
  • 首先,这是很糟糕的normalized 数据库。您可能想了解如何正确规范化数据结构,以便正确访问和操作数据。 Permission 在 role_perm 中的顺序是给定的还是也可以是 P2, P1
  • 感谢大家的回复,我已经在上面进行了更改以表示实际结构,它是实际的规范化表格

标签: sql oracle


【解决方案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 - 执行插入。在第一行放置应检查的权限。

【讨论】:

    【解决方案2】:

    首先这些表没有被规范化,如果你有权限改变表结构,你必须考虑以下 01 单列(单行)不应该有多个值 02 所以你必须创建具有两列角色的表,使用复合主键的权限(对两列都使用主键)

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

    这个结构中的行不能重复

    【讨论】:

    • 感谢您的快速回复,我已将第三张表格用于说明要求。实际上,我们在表中有多个条目对应于每个“行:权限”组合(您正确提到的方式),是的,不允许重复
    • 不客气。然后最好创建我提到的表。编写一个选择查询以根据您的要求查看数据
    • 表格如您所说。我需要查询方面的帮助,因为我想要与精确给定的参数(权限)匹配,并且由于给定的参数是动态的,我们无法使用“=”创建 sql。我也尝试过使用“IN”运算符,但它再次返回匹配的所有行
    • 你使用的数据库是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多