用于连接的SQL语法

时间:2011-11-10 16:10:54

标签: 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 个答案:

答案 0 :(得分: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)组合的行。

答案 1 :(得分:0)

有没有理由认为CROSS JOIN不适合解决这个问题?

似乎OP要求两个表之间所有可能的有效组合,这是CROSS的完美理由,不是吗?