2012-09-04 188 views
0
SELECT DISTINCT 
    A.currency_code AS currency_code, 
    NVL (B.Acct_ID, A.Acct_ID) SECND_Acct_ID, 
    NVL (B.Type_currency_code, A.Type_currency_code) SECND_Type_currency_code, 
    NVL (B.Seg_Type, A.Seg_Type) SECND_Seg_Type, 
    NVL (B.B_Func_Code, A.B_Func_Code) SECND_B_Func_Code, 
    A.Acct_ID AS PRIM_Acct_ID, 
    A.Type_currency_code AS PRIM_Type_currency_code, 
    A.Seg_Type AS PRIM_Seg_Type, 
    A.B_Func_Code AS PRIM_B_FuncCode 
FROM (SELECT Acct_ID, 
      Type_currency_code, 
      Seg_Type, 
      B_Func_Code, 
      B_ID, 
      B_NBR, 
      currency_code 
     FROM BAU 
    WHERE P_A_IND IN ('Y')) A 
LEFT OUTER JOIN 
    (SELECT Acct_ID, 
      Type_currency_code, 
      Seg_Type, 
      B_Func_Code, 
      B_ID, 
      B_NBR, 
      currency_code 
     FROM BAU 
    WHERE P_A_IND IN ('N')) B 
ON  A.B_NBR = B.B_NBR 
    AND A.B_ID = B.B_ID 
    AND A.currency_code = B.currency_code 
  • 目的是識別同一表上的不同的初級和次級(PRIM_Acct_ID,PRIM_Type_currency_code,PRIM_Seg_Type,PRIM_B_FuncCode)列。
  • 將p_a_ind(主要指示符)作爲Y的是主要的,否則是次要的。
  • b_nbr,b_id和currency_code是我進行自聯接的主鍵。

我想知道/看看是否有更好的方式來編寫此查詢。有沒有更好的方法來編寫這個SQL?

+1

在元層次,你可以用它有點更具描述性的和一些小寫字母的別名,所以它不是那麼大聲呼喊。 –

+1

'DISTINCT'表明有一列或多列應該包含在'JOIN'條件或'WHERE'子句中,以使它更「獨特」。而且你的列名是_terrible_ - 沒有必要縮寫,因爲我知道每個RDBMS都允許兩位數的名字長度。 –

+0

沒有理由爲'A'子選擇...雖然它應該導致相同的執行計劃。你也可以使用'case when'和聚合函數來只使用一個tablecan,儘管它看起來不漂亮。 – Ben

回答

1

您可以通過子查詢移動條件的whereon條款,分別闡明查詢:

SELECT ... 
FROM BAU A 
LEFT JOIN 
     BAU B 
ON  B.P_A_IND IN ('N') 
     AND A.B_NBR = B.B_NBR 
     AND A.B_ID = B.B_ID 
     AND A.currency_code = B.currency_code 
WHERE A.P_A_IND IN ('Y') 
相關問題