避免多次加入同一张表

Posted

技术标签:

【中文标题】避免多次加入同一张表【英文标题】:Avoid joining same table multiple times 【发布时间】:2019-04-10 00:15:52 【问题描述】:

我需要帮助来。这是我的示例查询。

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

当我使用左连接时,如果 ID 列存在很多性能问题,我最终会在每种类型上将 table2 与 table1 连接三次。我怎样才能以不同的方式编写它以避免多次加入。这是样本数据。任何帮助表示赞赏

    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

【问题讨论】:

您使用的是哪个数据库?你用 mysql 和几个 Oracle 版本标记了这个...... 感谢您的快速回复。我们正在使用 oracle 12g 然后去掉不相关的 MySQL 标签。而且您甚至没有使用 oracle 12 标签,而是使用了 10 和 11……虽然通用标签可能没问题。 这个查询似乎没问题。解释计划显示什么? 【参考方案1】:

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

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,这并不完全相同,但我猜这不会发生)。李>

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

【讨论】:

以上是关于避免多次加入同一张表的主要内容,如果未能解决你的问题,请参考以下文章

多次加入同一个房间和一个房间的客户

如何避免多次调用同一个函数?

如何避免在同一个选择中多次重复计算表达式?

多次加入同一个表以每次使用过滤器检索不同的数据

include 和 require 的区别是什么? 如何避免多次包含同一文件?

16.语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们?