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。这个查询提示我,但问题是我不知道这些属性的位置。你能不能给我一些指导,继续前进。!!!
问候。
答案 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;
/