快速的方式找到交集可能是創建一個全局臨時表,並與TA傳遞填充它數字。然後,您可以使用SET_DEFINITIONS加入此表以查找所有可能的匹配項。您需要檢查每個匹配集中的總數以消除超集。
創建一些基本的表...
create table set_definitions (
setkey number,
setentry number,
constraint pk_set_definitions primary key (setkey, setentry)
);
insert into set_definitions values (1,2);
insert into set_definitions values (1,4);
insert into set_definitions values (2,1);
insert into set_definitions values (2,2);
insert into set_definitions values (3,1);
insert into set_definitions values (3,2);
insert into set_definitions values (3,3);
創建一個全局臨時表來保存傳遞值:
create global temporary table tmp_setentry (
setentry number,
constraint pk_tmp_setentry primary key (setentry));
insert into tmp_setentry values (1);
insert into tmp_setentry values (2);
加入與set_definitions找到匹配的組(S):
select
setkey
from
(
select
setkey,
count(*) num_matches,
(select count(*) from set_definitions where setkey = s.setkey)
num_set_entries,
(select count(*) from tmp_setentry) num_entries
from
set_definitions s
inner join tmp_setentry t on t.setentry = s.setentry
group by
setkey
)
where
num_matches = num_entries
and num_set_entries = num_entries
--> 2 (3 is dropped as a superset)
希望這會有所幫助。
我喜歡用表的想法(數字),而不是我創造的方式一個全球臨時表。我做了一個直接的內部連接,並且對不知道set_definitions大小的匹配元素進行了成員計數檢查。也想知道處理多個匹配,但函數返回是一個單一的數字,所以可能不是一個要求。 – 2010-10-19 15:24:30