我将首先创建将获得最终结果的测试数据。首先,CREATE TABLE 语句;然后,在每个表中插入一个。
create table t12 (pos1 varchar2(2), pos2 varchar2(2));
create table t21 (pos1 varchar2(2), pos2 varchar2(2));
create table t13 (pos1 varchar2(2), pos3 varchar2(2));
create table t31 (pos1 varchar2(2), pos3 varchar2(2));
create table t14 (pos1 varchar2(2), pos4 varchar2(2));
create table t41 (pos1 varchar2(2), pos4 varchar2(2));
create table t15 (pos1 varchar2(2), pos5 varchar2(2));
create table t51 (pos1 varchar2(2), pos5 varchar2(2));
create table t16 (pos1 varchar2(2), pos6 varchar2(2));
create table t61 (pos1 varchar2(2), pos6 varchar2(2));
create table t23 (pos2 varchar2(2), pos3 varchar2(2));
create table t32 (pos2 varchar2(2), pos3 varchar2(2));
create table t24 (pos2 varchar2(2), pos4 varchar2(2));
create table t42 (pos2 varchar2(2), pos4 varchar2(2));
create table t25 (pos2 varchar2(2), pos5 varchar2(2));
create table t52 (pos2 varchar2(2), pos5 varchar2(2));
create table t26 (pos2 varchar2(2), pos6 varchar2(2));
create table t62 (pos2 varchar2(2), pos6 varchar2(2));
create table t34 (pos3 varchar2(2), pos4 varchar2(2));
create table t43 (pos3 varchar2(2), pos4 varchar2(2));
create table t35 (pos3 varchar2(2), pos5 varchar2(2));
create table t53 (pos3 varchar2(2), pos5 varchar2(2));
create table t36 (pos3 varchar2(2), pos6 varchar2(2));
create table t63 (pos3 varchar2(2), pos6 varchar2(2));
create table t45 (pos4 varchar2(2), pos5 varchar2(2));
create table t54 (pos4 varchar2(2), pos5 varchar2(2));
create table t46 (pos4 varchar2(2), pos6 varchar2(2));
create table t64 (pos4 varchar2(2), pos6 varchar2(2));
create table t56 (pos5 varchar2(2), pos6 varchar2(2));
create table t65 (pos5 varchar2(2), pos6 varchar2(2));
insert into t12 values('AB', 'CD');
insert into t21 values('AB', 'CD');
insert into t13 values('AB', 'FS');
insert into t31 values('AB', 'FS');
insert into t14 values('AB', 'KE');
insert into t41 values('AB', 'KE');
insert into t15 values('AB', 'HA');
insert into t51 values('AB', 'HA');
insert into t16 values('AB', 'KA');
insert into t61 values('AB', 'KA');
insert into t23 values('CD', 'FS');
insert into t32 values('CD', 'FS');
insert into t24 values('CD', 'KE');
insert into t42 values('CD', 'KE');
insert into t25 values('CD', 'HA');
insert into t52 values('CD', 'HA');
insert into t26 values('CD', 'KA');
insert into t62 values('CD', 'KA');
insert into t34 values('FS', 'KE');
insert into t43 values('FS', 'KE');
insert into t35 values('FS', 'HA');
insert into t53 values('FS', 'HA');
insert into t36 values('FS', 'KA');
insert into t63 values('FS', 'KA');
insert into t45 values('KE', 'HA');
insert into t54 values('KE', 'HA');
insert into t46 values('KE', 'KA');
insert into t64 values('KE', 'KA');
insert into t56 values('HA', 'KA');
insert into t65 values('HA', 'KA');
commit;
现在寻找解决方案。从 INTERSECT 开始,您就走在了正确的轨道上。使用 WITH 子句,您可以列出所有交集子查询并将 30 个表减少到 15 个子查询。之后,您需要开始加入。我在连接中使用了 USING 子句,因为它执行相等连接并合并连接列。
with q12 as (select * from t12 intersect select * from t21)
, q13 as (select * from t13 intersect select * from t31)
, q14 as (select * from t14 intersect select * from t41)
, q15 as (select * from t15 intersect select * from t51)
, q16 as (select * from t16 intersect select * from t61)
, q23 as (select * from t23 intersect select * from t32)
, q24 as (select * from t24 intersect select * from t42)
, q25 as (select * from t25 intersect select * from t52)
, q26 as (select * from t26 intersect select * from t62)
, q34 as (select * from t34 intersect select * from t43)
, q35 as (select * from t35 intersect select * from t53)
, q36 as (select * from t36 intersect select * from t63)
, q45 as (select * from t45 intersect select * from t54)
, q46 as (select * from t46 intersect select * from t64)
, q56 as (select * from t56 intersect select * from t65)
select pos1, pos2, pos3, pos4, pos5, pos6
from q12
join q13 using(pos1)
join q14 using(pos1)
join q15 using(pos1)
join q16 using(pos1)
join q23 using(pos2, pos3)
join q24 using(pos2, pos4)
join q25 using(pos2, pos5)
join q26 using(pos2, pos6)
join q34 using(pos3, pos4)
join q35 using(pos3, pos5)
join q36 using(pos3, pos6)
join q45 using(pos4, pos5)
join q46 using(pos4, pos6)
join q56 using(pos5, pos6);
POS1 POS2 POS3 POS4 POS5 POS6
---- ---- ---- ---- ---- ----
AB CD FS KE HA KA