数据库左外连接到具有最佳性能的Same表

时间:2015-09-03 16:07:50

标签: sql database join left-join

我有一个带代码和状态的状态表A.其描述与特定名称有关。

Code   Desc       Name
 01    INITIAL   STATUS_A
 02    SUCCESS   STATUS_A
 03    FAILED    STATUS_A
 04    FAILED    STATUS_B
 05    RETRY     STATUS_C
 06    SUCESS    STATUS_D

依旧...... 现在我有一个表B作为主记录,表A中有代码关联。

ID  column1 column2 column3 statusA statusB statusC statusD 
432   XXXX   YYYY    ZZZZ      03     04      05      06      

现在我需要形成一个查询来获取表A中代码描述的输出数据。

我使用左外连接完成了这个。有人可以建议更好的解决方案。

左外连接查询

Select b.column1 ,b.column2, a1.Desc as Status_A_Desc , a2.Desc as Status_B_Desc, a3.Desc as Status_C_Desc, a4.Desc as Status_D_Desc from B b left outer join A a1 on a1.code = b.statusA and a1.Name ='STATUS_A' left outer join A a2 on a2.code = b.statusB and a2.Name ='STATUS_B' left outer join A a3 on a3.code = b.statusC and a3.Name ='STATUS_C' left outer join A a4 on a4.code = b.statusD and a4.Name ='STATUS_D' where b.ID = 432

1 个答案:

答案 0 :(得分:0)

您可以使用条件聚合:

select a.code,
       max(case when a.name = 'Status_A' then a.desc end) as a,
       max(case when a.name = 'Status_B' then a.desc end) as b,
       max(case when a.name = 'Status_C' then a.desc end) as c,
       max(case when a.name = 'Status_D' then a.desc end) as d
from a
group by a.code;

根据您的数据库,连接可能会更好。这样做的好处是,您可以添加任意数量的字段,基本上具有相同的性能。