仅返回 Oracle SQL 查询中具有多个“OR”条件的 JOIN 的第一个匹配的记录

问题描述 投票:0回答:1

我有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
    ,如果匹配,则返回行而不检查第三行。
  • 与第三种情况相同。

我对这个查询有点困惑。在这种情况下,返回应该是:

谢谢。

sql oracle
1个回答
0
投票

这是一种选择;我希望其他人发布更好的,因为我不是特别喜欢。

样本数据;我用另一行扩展了

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>
© www.soinside.com 2019 - 2024. All rights reserved.