我有2张桌子。
第一个只有 id 字段:
CREATE TABLE a_test (id_test VARCHAR2(20));
INSERT INTO a_test VALUES ('AAA');
INSERT INTO a_test VALUES ('BBB');
INSERT INTO a_test VALUES ('CCC');
第二个表有 3 列,其中可以在其中一列或多列中引用第一个 a_test 表的 id_test 。
CREATE TABLE dummy_test (id_first VARCHAR2(20), id_second VARCHAR2(20), id_third VARCHAR2(20));
INSERT INTO dummy_test VALUES ('AAA', 'test', 'test');
INSERT INTO dummy_test VALUES ('test', 'test', 'BBB');
INSERT INTO dummy_test VALUES ('CCC', 'AAA', 'test');
INSERT INTO dummy_test VALUES ('test', 'BBB', 'CCC');
INSERT INTO dummy_test VALUES ('AAA', 'BBB', 'CCC');
在最终查询中,我需要使用以下逻辑返回
a_test.id_test, dummy_test.*
a_test.id_test = dummy_test.id_first
匹配,则返回该行而不检查 dummy_test.id_second , dummy_test.id_third
a_test.id_test = dummy_test.id_first
不匹配,则检查a_test.id_test = dummy_test.id_second
,如果匹配,则返回行而不检查第三行。我对这个查询有点困惑。在这种情况下,返回应该是:
谢谢。
这是一种选择;我希望其他人发布更好的,因为我不是特别喜欢。
样本数据;我用另一行扩展了
dummy_test
表,该行的值根本不存在于 a_test
中,并且应该 - 我认为 - 被跳过。我还在 rn
中添加了 dummy_test
列以进行排序;它没有在其他地方使用。
SQL> select * from a_test;
ID_TEST
--------------------
AAA
BBB
CCC
SQL> select * from dummy_test order by rn;
RN ID_FIRST ID_SECOND ID_THIRD
---------- -------------------- -------------------- --------------------
1 AAA test test
2 test test BBB
3 CCC AAA test
4 test BBB CCC
5 AAA BBB CCC
6 XXX YYY ZZZ
6 rows selected.
查询使用 3 个 CTE,每个 CTE 都连接第一个、第二个或第三个
ID
值上的表,同时跳过其值已在前一个 CTE 中收集的行。最终结果是这 3 个 CTE 的并集:
SQL> with
2 t1 as
3 (select a.id_test, b.*
4 from dummy_test b join a_test a on a.id_test = b.id_first
5 ),
6 t2 as
7 (select a.id_test, b.*
8 from dummy_test b join a_test a on a.id_test = b.id_second
9 where not exists (select null from t1
10 where t1.id_first = b.id_first)
11 ),
12 t3 as
13 (select a.id_test, b.*
14 from dummy_test b join a_test a on a.id_test = b.id_third
15 where not exists (select null from t2
16 where t2.id_second = b.id_second)
17 )
18 select * from t1
19 union
20 select * from t2
21 union
22 select * From t3
23 order by 2
24 /
结果:
ID_TEST RN ID_FIRST ID_SECOND ID_THIRD
-------------------- ---------- -------------------- -------------------- --------------------
AAA 1 AAA test test
BBB 2 test test BBB
CCC 3 CCC AAA test
BBB 4 test BBB CCC
AAA 5 AAA BBB CCC
SQL>