【发布时间】: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……虽然通用标签可能没问题。
-
这个查询似乎没问题。解释计划显示什么?