Быстрый способ найти пересечение может состоять в том, чтобы создать глобальную временную таблицу и заполнить ее переданной таблицей чисел.Затем вы можете присоединиться к этой таблице с помощью 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, чтобы найти соответствующие наборы:
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)
Надеюсь, это поможет.