【问题标题】:Left Outer Join returning duplicate左外连接返回重复
【发布时间】:2013-04-03 23:53:50
【问题描述】:

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

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 的通用覆盖被返回。我认为案例声明足以对此进行排序。它必须是我加入 DP_CrossReference。我怎样才能加入这个表,这样我就不会得到重复,但它涵盖了特定的投资组合覆盖、通用覆盖和没有覆盖的位置?

【问题讨论】:

  • 如果您有 SEDOL= 1 AND Portfolio = 1,应该采用哪个覆盖?您拥有相同价值的投资组合和通用覆盖。这就是重复的地方。
  • 这只是示例数据,这不是我的实际数据的问题

标签: tsql join left-join


【解决方案1】:

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

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

【讨论】:

  • 感谢您,将连接从 1 拆分为 2 似乎已经成功了。
猜你喜欢
  • 2018-05-23
  • 2021-01-20
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2017-09-28
  • 2018-07-11
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多