簡體   English   中英

數據庫左外部連接到具有最佳性能的Same表

[英]Database left outer join to with Same table with optimal performance

我有一個狀態表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

您可以改為使用條件聚合:

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;

根據您的數據庫,聯接可能會更好。 這樣做的好處是,您可以添加任意數量的字段,並且性能基本相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM