为了获得可能的组合,交叉连接有效。
所以你可以得到你的 24 行:
with a as (
select 1 id1 from dual union all
select 2 id1 from dual union all
select 3 id1 from dual )
, b as (
select 1 id2 from dual union all
select 2 id2 from dual union all
select 3 id2 from dual union all
select 4 id2 from dual )
, c as (
select 1 id3 from dual union all
select 2 id3 from dual )
select id1, id2, id3
from a cross join b cross join c;
从那里查找表中存在或不存在的组合是一个非常简单的步骤。要获取不在目标表中的组合,您可以:
with a as (
select 1 id1 from dual union all
select 2 id1 from dual union all
select 3 id1 from dual )
, b as (
select 1 id2 from dual union all
select 2 id2 from dual union all
select 3 id2 from dual union all
select 4 id2 from dual )
, c as (
select 1 id3 from dual union all
select 2 id3 from dual )
, t as (
select 1 id1, 1 id2, 1 id3 from dual union all
select 1 id1, 1 id2, 2 id3 from dual union all
select 1 id1, 2 id2, 1 id3 from dual union all
select 1 id1, 2 id2, 2 id3 from dual union all
select 1 id1, 3 id2, 1 id3 from dual union all
select 1 id1, 4 id2, 2 id3 from dual )
select lst.id1, lst.id2, lst.id3
from (
select id1, id2, id3
from a cross join b cross join c ) lst
where not exists (select 1 from t
where t.id1 = lst.id1
and t.id2 = lst.id2
and t.id3 = lst.id3)
或者,使用 NOT IN 测试:
select lst.id1, lst.id2, lst.id3
from (
select id1, id2, id3
from a cross join b cross join c ) lst
where (id1, id2, id3) not IN (select distinct id1, id2, id3 from t)
Alex 的减号做同样的事情,都得出相同的结果集 - 哪个选项效果最好可能取决于复合表中的记录数、可用索引,以及 - 最重要的是 - 你到底是什么想要。
如果您只想知道缺少一个或多个组合,请使用尽快短路的选项。例如,EXISTS 将在遇到评估为 TRUE 的案例时停止检查