我需要避免多次连接同一张表的帮助。这是我的示例查询。
表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
答案 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
,这并不完全相同,但是我猜想是不会发生。)没有理由避免三次加入该表。这就是您的数据模型所需要的,因为您有三个单独的外键引用。