Oracle

有沒有比兩次加入表更好的選擇來為輸出中的特定列保留一條記錄?

  • October 13, 2020

我有兩個具有以下結構的表:

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 Bankbrn_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

其中,你會注意到:

  1. 程式碼量差不多
  2. 更難理解
  3. 即使它只執行一次連接,它仍然可能不會產生最佳查詢計劃,這取決於是否TABLE_LC是索引組織的。

您也可以使用PIVOT,但同樣,可能不會節省太多時間,並且您會遇到處理愚蠢的列名的問題。

主鍵/適當索引上的連接通常不會那麼昂貴,因此避免它們僅在某些情況下才有意義。

引用自:https://dba.stackexchange.com/questions/276585