2011-10-31 28 views
0

我有關於兩個表(A,B)帳戶的信息。 A中的記錄在帳戶級別(account_id)都是唯一的,但在表B中,帳戶由account_id和month_start_dt標識,因此每個帳戶可能存在零個或多個月。SQL:左外部聯接,不同的GROUP BY,需要複製記錄?

問題是,當我離開外連接A到B時,連接表包含來自A的所有記錄和來自B的記錄(按帳戶,按月計)在給定月份中在表B中不存在的任何帳戶沒有該月份的記錄。

期望的結果:如果帳戶不表B中給定月份存在,創建一個記錄與month_start_dt和0所有變量的加入表帳戶從B.

被選定爲它的立場,我可以讓連接工作,在B中沒有出現的所有賬戶(根本沒有出現,在任何月份)都有從B選擇的所有變量的0個值(使用nvl(variable,0)),但是這些賬戶只有一個記錄。他們每個月都應該有一個。

+0

你能後,你試一下查詢? –

+0

我不確定我是否可以。我在工作,我不知道什麼法律認爲專有。我將嘗試處理一個不引用任何字段名稱或表名以及不引用的示例。 –

回答

1

創建一個臨時表,其中包含您想要的不存在行的記錄數,並且右鍵連接第一個查詢的結果。

select tbl.* from (select * from A left join B on a.col1 = b.col2) tbl join tmpTable on tbl.col2 = tmpTable.zerocol 

試試這個。

+0

你說得對。我剛剛意識到的是,在一個月的列表中交叉連接一個賬戶列表給出了可以在表B上留下的沒有任何問題的表格。 –

1

我不明白你爲什麼要需要一個外連接。這將使用標準SQL的EXCEPTMINUS在甲骨文):

SELECT account_id, month_start_dt, all_variables 
    FROM B 
UNION 
(
SELECT account_id, month_start_dt, 0 AS all_variables 
    FROM A 
     CROSS JOIN (
        SELECT DISTINCT month_start_dt 
         FROM B 
        ) AS DT1 
EXCEPT 
SELECT account_id, month_start_dt, 0 AS all_variables 
    FROM B 
); 
1

你可以使用一個符合日曆表,伴月(幾年)。看到這個類似的問題:How to create a Calender table for 100 years in Sql

然後有:

FROM 
     A 
    CROSS JOIN 
     (SELECT y 
       , m 
      FROM Calendar 
      WHERE ( y = @start_year 
       AND m >= @start_month 
       ) 
      OR ( y > @start_year 
       AND y < @end_year 
       ) 
      OR ( y = @end_year 
       AND m <= @end_month 
       ) 
     ) AS C 
    LEFT JOIN 
     B 
      ON B.account_id = A.account_id 
      AND YEAR(B.start_date) = C.y 
      AND MONTH(B.start_date) = C.m