Left Outer Join返回重复

时间:2013-04-11 17:01:55

标签: tsql join left-join

我有一个场景,我想用交叉引用表中的另一个值覆盖一个值。它们可以是通用覆盖或特定于组合的覆盖。我的交叉引用表如下所示:

SEDOL    Portfolio    Override
1        1            Technology
1        2            Financial
1        NULL         Industrial
2        NULL         Technology
3        NULL         Financial

如果投资组合是NULL,那么它是一个通用覆盖,如果它有一个投资组合编号,那么它是一个特定于投资组合的覆盖。

那么我的选择会是这样的:

SELECT
          Portfolio
      ,   SEDOL
      ,   CASE
              WHEN hack.SEDOL = ia.SEDOL AND hack.Portfolio = ia.Portfolio THEN hack.Override  -- Portfolio Specific Hack
              WHEN hack.SEDOL = ia.SEDOL AND hack.Portfolio IS NULL THEN hack.Override              -- Hack for all portfolio's
              ELSE ia.Sector
          END

FROM positions as ia

     LEFT OUTER JOIN DP_CrossReference AS hack  -- Override/Hacks
          ON hack.SEDOL = ia.SEDOL
          AND (hack.Portfolio = ia.Portfolio OR hack.Portfolio IS NULL)

我似乎正在获得重复项,但是对于投资组合1,其中返回了特定于投资组合的覆盖并且为SEDOL 1返回了通用覆盖。我认为案例statemt足以对此进行排序。它必须是我加入DP_CrossReference。我怎样才能加入这个表,这样我就不会重复,但它涵盖了特定的投资组合覆盖,通用覆盖和没有覆盖的帖子?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,请试试。

SELECT
          ia.Portfolio
      ,   ia.SEDOL
      ,   COALESCE(ov1.Override,ov2.Override, ia.Sector)
FROM positions as ia
LEFT OUTER JOIN DP_CrossReference AS ov1 --  portfolio specific overrides
          ON ov1.SEDOL = ia.SEDOL
          AND ov1.Portfolio = ia.Portfolio
LEFT OUTER JOIN DP_CrossReference AS ov2 -- universal overrides 
          ON ov2.SEDOL = ia.SEDOL
          AND ov2.Portfolio IS NULL