将规则数据链接到PL / SQL中的主数据表

时间:2013-07-23 10:38:55

标签: sql performance oracle select

create table CIT_ADMIN.OBJECT_DETAIL_MASTER (
  RULE_ID   VARCHAR(10), 
  ATTR_1   VARCHAR(50), 
  ATTR_2   VARCHAR(50), 
  ATTR_3   VARCHAR(50), 
  CREATED_DATE    DATE DEFAULT SYSDATE)

create table CIT_ADMIN.PRIORITY_RULE_FACTORY (
  RULE_ID   VARCHAR(10), 
  RULE_DESC VARCHAR(10), 
  RULE_1   VARCHAR(50), 
  RULE_2   VARCHAR(50), 
  RULE_3   VARCHAR(50), 
  CREATED_DATE    DATE DEFAULT SYSDATE)

insert into CIT_ADMIN.PRIORITY_RULE_FACTORY
       (RULE_ID, RULE_DESC,  RULE_1,         RULE_2,          RULE_3)
values ('1',     'POSITION', 'ODS_KEY',      'NOTIONAL',      'SIK')

insert into CIT_ADMIN.PRIORITY_RULE_FACTORY
       (RULE_ID, RULE_DESC,  RULE_1,         RULE_2,          RULE_3)
values ('2',     'CLIENT',   'UCN',          'AGREEMENT_ID',  'FACILITY_ID')

insert into CIT_ADMIN.PRIORITY_RULE_FACTORY
       (RULE_ID, RULE_DESC,  RULE_1,         RULE_2,          RULE_3)
values ('3',     'NETTING',  'AGREEMENT_ID', 'AGREEMENT_AMT', 'MATURITY')

insert into CIT_ADMIN.OBJECT_DETAIL_MASTER
       (RULE_ID, ATTR_1, ATTR_2, ATTR_3)
values ('1',     '123',  '1000', '600')

insert into CIT_ADMIN.OBJECT_DETAIL_MASTER
       (RULE_ID, ATTR_1, ATTR_2, ATTR_3)
values ('2',     '456',  '2000', '500')

insert into CIT_ADMIN.OBJECT_DETAIL_MASTER
       (RULE_ID, ATTR_1, ATTR_2, ATTR_3)
values ('3',     '789',  '3000', '400')

这些是我的表格。规则id是主表中的外键,也是规则工厂表中的主键。我尝试编写可以将规则与数据链接的查询。

**Like:**
WITH ATTR AS (SELECT * FROM CIT_ADMIN.PRIORITY_RULE_FACTORY WHERE RULE_DESC = 'POSITION')

SELECT ATTR_2 FROM CIT_ADMIN.OBJECT_DETAIL_MASTER a
WHERE RULE_ID in (SELECT ATTR.RULE_ID FROM attr) 
AND ATTR_1 = '123'

如果我知道位置和ods_key,我想要Notional。这个查询提示我,但问题是我不知道这些属性的位置。你能不能给我一些指导,继续前进。!!!

问候。

2 个答案:

答案 0 :(得分:1)

如果您规范化"规则"您可能会发现它更容易使用。和"属性" - 创建一个包含单个属性名称的表格(例如' ODS_KEY',' NOTIONAL'等)以及与之相关的值(例如123,1000等)并将其与此相关联规则(例如' POSITION','客户',' NETTING'等)。

分享并享受。

答案 1 :(得分:1)

我认为这是一个非常有绳索的设计。我的意思是,当臭名昭着的EAV模式看起来像一个明智的选择时,模型肯定有问题。

无论如何,这是一个解决手头任务的函数:我建议一个函数只是因为Rules Engines是棘手的野兽,并且在修改你的功能时封装将很好地为你服务。

create or replace function eval_rule
    ( p_rule_id in priority_rule_factory.rule_id%type
      , p_rule in priority_rule_factory.rule_1%type )
     return object_detail_master.attr_1%type
is
    return_value object_detail_master.attr_1%type;
begin

     select case 
            when prf.rule_1 = p_rule then odm.attr_1
            when prf.rule_2 = p_rule then odm.attr_2
            when prf.rule_3 = p_rule then odm.attr_3
            end
    into return_value
    from priority_rule_factory prf
         join object_detail_master odm
            on prf.rule_id = odm.rule_id
    where prf.rule_id = p_rule_id;        

    return return_value;
end eval_rule;
/