避免多次连接同一张表

时间:2019-04-10 00:15:53

标签: sql oracle

我需要避免多次连接同一张表的帮助。这是我的示例查询。

表1具有3列ABC_ID,DEF_ID,XYZ_ID,并与ID列上的table2关联。 table1中的3列值可以为null,如果存在值,那么我需要使用select语句中的不同列名从表2返回关联值。

当我使用左联接时,如果ID列存在很多性能问题,那么每种类型的table1都会与table1联接3次。我如何以不同的方式编写此代码,以避免多次加入。这是示例数据。感谢您的帮助

    select 
          (
          CASE
            WHEN ( table2.ID = table1.ABC_ID)
            THEN table2.ID_VAL
            ELSE 'TEST1'
          END ) AS "TEST1",
          (
          CASE
            WHEN (table2a.ID = table1.DEF_ID)
            THEN table2a.ID_VAL
            ELSE 'TEST2'
          END ) AS "TEST2",
          (
          CASE
            WHEN (table2b.ID = table1.XYZ_ID)
            THEN table2b.ID_VAL
            ELSE 'TEST3'
          END ) AS "TEST3"
    from table1 table1 
    left join table2 table2 on   (table2.ID=table1.ABC_ID)
    left join table2 table2a on   ( table2a.id=table1.DEF_ID)
    left join table2 table2b on   ( table2b.id=table1.XYZ_ID)
    where table1.Id_NUM='1'

表1

    Id_NUM  ABC_ID     DEF_ID    XYZ_ID
    1       12345      456789    32145
    2       null       456789    32145
    3       12345      null      null

表2

    ID         ID_VAL
    12345      abcded
    456789     kjwsddk
    321456     wedfgfv

输出

    TEST1         TEST2       TEST3
    12345         456789      32145

1 个答案:

答案 0 :(得分:0)

您的join很好,但是查询可以简化:

select coalesce(t2a.ID_VAL, 'TEST1') as test1,
       coalesce(t2d.ID_VAL, 'TEST2') as test2,
       coalesce(t2x.ID_VAL, 'TEST3') as test3
from table1 t1 left join
     table2 t2a
     on t2a.ID = t1.ABC_ID left join
     table2 t2d
     on t2d.id = t1.DEF_ID left join
     table2 t2x
     on t2x.id = t1.XYZ_ID
where t1.Id_NUM = 1;

注意:

  • 表别名应该有意义。在这种情况下,别名包括用于连接的列的缩写。
  • 大概id_num是一个数字,因此请勿将单引号用作该值。
  • 没有理由对列名进行转义。双引号只会增加查询的混乱程度。
  • case表达式可以替换为coalesce(),这更简单(如果id_val可以为NULL,这并不完全相同,但是我猜想是不会发生。)

没有理由避免三次加入该表。这就是您的数据模型所需要的,因为您有三个单独的外键引用。