Oracle
有沒有比兩次加入表更好的選擇來為輸出中的特定列保留一條記錄?
我有兩個具有以下結構的表:
create table TABLE_LC ( lc_num NUMBER, brn_code NUMBER, brn_role NUMBER) create table BRN ( brn_code NUMBER, brn_name VARCHAR2(50))
每個表的一些範例數據如下:
"TABLE_LC": lc_num | brn_code | brn_role ------------------------------------ 1 | 1 | 1010 1 | 2 | 2020 "BRN": brn_code | brn_name --------------------- 1 | BAHAR 2 | KAJ
我需要
one record for each lc_num
在 TABLE_LC 中擁有,並且基於給定表和數據的所需輸出是這樣的:lc_num | Advising_Bank | Issuing_Bank ------------------------------------------- 1 | BAHAR | KAJ
我寫的是下面的查詢,它給了我正確的輸出,考慮到我們知道
brn_role=1010 represents Advising Bank
和brn_role=2020 represents Issuing Bank
select t1.lc_num, t2.brn_name "Advising Bank", t4.brn_name "Issuing bank" from TABLE_LC t1 inner join BRN t2 on t1.brn_code = t2.brn_code and t1.brn_role = 1010 inner join TABLE_LC t3 on t3.lc_num = t1.lc_num inner join BRN t4 on t4.brn_code = t3.brn_code and t3.brn_role = 2020
如您所見,我已經加入了兩次基表,我想知道是否有更好的方法來獲得所需的輸出?
提前致謝
更好的?這取決於。
如果主鍵
TABLE_LC
是,(lc_num, brn_role)
那麼您可以執行以下操作:SELECT lc_Num ,MAX ( CASE WHEN brn_role = 1010 THEN brn_name ELSE NULL END ) AS Advising_Bank ,MAX ( CASE WHEN brn_role = 2020 THEN brn_name ELSE NULL END ) AS Issuing_Bank FROM ( SELECT LC.lc_num ,LC.brn_role ,LC.brn_code ,BRN.brn_name FROM TABLE_LC LC INNER JOIN BRN BRN ON BRN.brn_code = LC.brn_code ) x GROUP BY lc_num
其中,你會注意到:
- 程式碼量差不多
- 更難理解
- 即使它只執行一次連接,它仍然可能不會產生最佳查詢計劃,這取決於是否
TABLE_LC
是索引組織的。您也可以使用PIVOT,但同樣,可能不會節省太多時間,並且您會遇到處理愚蠢的列名的問題。
主鍵/適當索引上的連接通常不會那麼昂貴,因此避免它們僅在某些情況下才有意義。