SQL通过引用加入自我

时间:2014-03-17 09:30:12

标签: sql sql-server tsql self-join

我有一张名为Form的表。我将它简化为如下:

    FormID     Ref     Premium
    1          AA      1000
    1          BB      900
    1          CC      600
    1          DD      100
    2          AA      0
    2          BB      0
    2          CC      0
    7          AA      211
    7          BB      101
    7          CC      300

例如,假设FormID = 1对应2013年数据,FormID = 7对应2012年数据(去年)。

我想要加入的数据,以便我希望这张表出来:

    CurrentFormID PriorFormID Ref PremiumCurrent PremiumPrior
    1             7           AA      1000       211
    1             7           BB      900        101
    1             7           CC      600        300
    1             NULL (OR 7) DD      100        NULL (OR 0)

基本上我需要类似于外连接的东西,我将CurrentFormID,PriorFormID指定为变量(即1和7)。引用必须相同或旧数据中的引用必须为null。

下面的查询是一个开始,但我只回到重叠的值(即两个集合中常见的引用。我还需要获取前一个表单中没有引用匹配的条目。

    SELECT 
        *
    FROM
        Form X
     OUTER JOIN Form Y
    ON  (X.FormID = @CurrentFormID AND Y.FormID = @PriorFormID) -
    WHERE X.Reference = Y.Reference
    ORDER BY X.Reference

我希望我有道理。

2 个答案:

答案 0 :(得分:0)

您应该交换ON和WHERE子句:

SELECT 
    *
FROM
    Form X
 OUTER JOIN Form Y
ON X.Reference = Y.Reference    
WHERE X.FormID = @CurrentFormID AND (Y.FormID IS NULL OR Y.FormID = @PriorFormID)

ORDER BY X.Reference

答案 1 :(得分:0)

SELECT
    X.FormId AS CurrentFormId,
    Y.FormId AS PriorFormId,
    X.Ref,
    X.Premium AS CurrentPremium,
    Y.Premium AS PriorPremium
FROM
    #MyTable X
LEFT JOIN
    (SELECT * FROM #MyTable WHERE FormId <> @CurrentFormId) Y  
ON
    X.Ref = Y.Ref
WHERE
    X.FormId = @CurrentFormId AND (Y.FormId = @PriorFormId OR Y.FormId IS NULL)

或者,子查询可以像这样构建:

(SELECT * FROM #MyTable WHERE FormId = @PriorFormId) Y