天天看點

oracle比對一對多,求教一個多對多的比對有關問題 Oracle

求教一個多對多的比對問題 Oracle

各位高手,小弟現在碰到一個問題,場景描述如下

現在有一張表 model  ,記錄了 模型與其符合條件的關系,模型與條件是多對多的關系,

create table model (model_id varchar2(10),condition_id varchar2(2),...)

例如:

model_id       condition_id

-----------    ------------

0000000001       1

0000000001       3

0000000002       2

0000000002       3

0000000003       4

........

還有一張表 rule ,記錄了 規則與其包含條件的關系,規則與條件關系也是多對多的

create table rule (rule_id varchar2(2),condition_id varchar2(2),...)

例如:

rule_id         condition_id

-----------     ------------

01               1

01               4

02               3

03               2

03               3

......

當 模型符合的條件的集合 可以包含 規則所包含條件的集合 時,則認為 模型滿足規則 最終将插入結果表 result

create table result (model_id varchar2(10),rule_id varchar2(2),...)

像這樣的SQL語句,除了用兩層循環 取出 每個模型的條件 與 每個規則的條件 比對以外,有沒有什麼更高效的SQL可以解決這個問題,希望各位高手能給予解答,謝謝!

------解決方案--------------------

--LZ,看下這個結果是不是你要的

SQL> with model(model_id,condition_id) as(

2  select '0000000001',1 from dual

3  union all select '0000000001',3 from dual

4  union all select '0000000002',2 from dual

5  union all select '0000000002',3 from dual

6  union all select '0000000003',4 from dual

7  ),

8  rule(rule_id,condition_id) as(

9  select '01',1 from dual

10  union all select '01',4 from dual

11  union all select '02',3 from dual

12  union all select '03',2 from dual

13  union all select '03',3 from dual

14  )

15  select model_id,rule_id from

16  (select model_id,wm_concat(condition_id) c from model

17  group by model_id) t1,

18  (select rule_id,wm_concat(condition_id) c from rule

19  group by rule_id) t2

20  where t1.c=t2.c;

MODEL_ID             RULE

-------------------- ----