oracle 基于多个表连接提取条件语句结果

baubqpgj  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(148)

我有3个表要连接,以获得以下格式的输出。

我的表1是这样的:

--------------------------------------------------------
    T1_ID1      |       T1_ID2      |       NAME
--------------------------------------------------------
    123         |       T11231      |       TestName11
    123         |       T11232      |       TestName12
    234         |       T1234       |       TestName13
    345         |       T1345       |       TestName14
--------------------------------------------------------

我的表2就像:

--------------------------------------------------------
    T2_ID1      |       T2_ID2      |       NAME
--------------------------------------------------------
    T11231      |       T21231      |       TestName21
    T11232      |       T21232      |       TestName21
    T1234       |       T2234       |       TestName22
--------------------------------------------------------

我的3号桌就像这样

----------------------------------------------------------
    T3_ID1      |       TYPE        |       REF
----------------------------------------------------------
    T21231      |       1           |       123456
    T21232      |       2           |       1234@test.com
    T2234       |       2           |       123@test.com
----------------------------------------------------------

我想要的输出是:

------------------------------------------------------
    T1_ID1      |       PHONE       |       EMAIL
------------------------------------------------------
    123         |       123456      |   1234@test.com
    234         |                   |   123@test.com
    345         |                   |
------------------------------------------------------

要求:

  • 表1的T1_ID2与表2的T2_ID1左联接。
  • 表2的T2_ID2与表3的T3_ID1左联接。
  • 如果值为phone,则表3的TYPE指定1;如果值为email,则指定2。
  • 我的输出应该包含表1的T1_ID1及其表3中REF的相应值,REF在同一行中。也就是说,在本例中,值为123的T1_ID1同时具有电话和电子邮件。因此,它在输出中显示在同一行中。
  • 如果只有phone可用于T1_ID1的相应值,则应在结果中将phone填充为空,并将email填充为空,反之亦然。
  • 如果电话和电子邮件都不可用,则不应填充任何内容。

我试过下面的SQL,但是没有成功。我错过了什么?请提供你的帮助。

选项1:

SELECT DISTINCT
    t1.t1_id1,
    t3.ref
    || (
        CASE
        WHEN t3.type = 1 THEN
        1
        ELSE
        0
        END
    ) phone,
    t3.ref
    || (
        CASE
        WHEN t3.type = 2 THEN
        1
        ELSE
        0
        END
    ) email
FROM
    table1 t1
    LEFT JOIN table2    t2 ON t1.t1_id2 = t2.t2_id1
    LEFT JOIN table3    t3 ON t2.t2_id2 = t3.t3_id1;

选项2:

SELECT DISTINCT
    t1.t1_id1,
    t3.ref, 
    (
        CASE
        WHEN t3.type = 1 THEN
        1
        ELSE
        0
        END
    ) phone,
    t3.ref,
    (
        CASE
        WHEN t3.type = 2 THEN
        1
        ELSE
        0
        END
    ) email
FROM
    table1 t1
    LEFT JOIN table2    t2 ON t1.t1_id2 = t2.t2_id1
    LEFT JOIN table3    t3 ON t2.t2_id2 = t3.t3_id1;

选项3:

SELECT DISTINCT
    t1.t1_id1,
    (
        CASE
        WHEN t3.type = 1 THEN
        1
        ELSE
        0
        END
    ) phone,
    (
        CASE
        WHEN t3.type = 2 THEN
        1
        ELSE
        0
        END
    ) email
FROM
    table1 t1
    LEFT JOIN table2    t2 ON t1.t1_id2 = t2.t2_id1
    LEFT JOIN table3    t3 ON t2.t2_id2 = t3.t3_id1;
dluptydi

dluptydi1#

select t1_id1, max(t3.ref )phone, max(t33.ref) email
 from table1
 left outer join
 table2 on t1_id2=t2_id1
 left outer join table3 t3 on t3.t3_id1=t2_id2 and t3.type=1
 left outer join table3 t33 on t33.t3_id1=t2_id2 and t33.type=2
 group by t1_id1

如果table2中每个t2_id2条目在table3中最多有一个电话和一个电子邮件。

相关问题