2011-11-10 32 views
0

假設我有兩個表:SQL語法加入

表A有關於股票持有不同的投資基金的信息:

FundID FundType StockID Weight 
1  Small  A   0.50 
1  Small  B   0.50 
2  Small  B   0.25 
2  Small  C   0.75 
3  Large  A   1.00 
4  Large  D   1.00 

表B總結了每個股票有中重每種類型的基金:

FundType StockID AvgWeight 
Small  A  0.25 
Small  B  0.375 
Small  C  0.375 
Large  A  0.5 
Large  D  0.5 

(請注意,如果一隻股票未列入基金,則重量假定爲0)

我想創建一個新表(使用SQL)有,表A中的每個FundID,由同一類型的任何基金持有的所有股票:

期望的結果的表:

FundID FundType StockID Weight AvgWeight 
1  Small  A   0.50  0.25 
1  Small  B   0.50  0.375 
1  Small  C     0.375 
2  Small  A     0.25 
2  Small  B   0.25  0.375 
2  Small  C   0.75  0.375 
3  Large  A   1.00  0.5 
3  Large  D     0.5 
4  Large  A     0.5 
4  Large  D   1.00  0.5 

注意所有股由任何小基金(A,B,和C)保持包括用於每個小基金(FundID是1或2) 。同樣,由大型基金(A和D)持有的所有股票都包含在每個大型基金的業績中。

我想我需要做一些外連接,但迄今一直無法弄清楚SQL語法。有任何想法嗎?謝謝!

回答

2
SELECT 
    ft.FundId 
    , ft.FundType 
    , fs.StockId 
    , aa.Weight   --- or COALESCE(aa.Weight, 0) to display 0 and not NULL 
    , bb.AvgWeight 
FROM 
     (SELECT DISTINCT 
       FundId 
      , FundType 
      FROM 
       TableA 
     ) AS ft 
    INNER JOIN 
     (SELECT DISTINCT 
       FundType 
      , StockId 
      FROM 
       TableA 
     ) AS fs 
      ON fs.FundType = ft.FundType 
    LEFT JOIN 
     TableB AS bb 
      ON bb.FundType = fs.FundType 
      AND bb.StockId = fs.StockId 
    LEFT JOIN 
     TableA AS aa 
      ON aa.FundId = ft.FundId 
      AND aa.FundType = ft.FundType 
      AND aa.StockId = fs.StockId 

INNER fs LEFT JOIN bb可以用一個簡單的INNER JOIN bb來代替,如果TableB具有用於所有(FundType, StockId)組合行。

+0

完美!非常感謝。 – itzy

0

是否有理由說CROSS JOIN不適合解決這個問題?

看起來好像OP是要求兩個表格之間的所有可能的有效組合,這是CROSS的最佳理由,不是嗎?