Tsql 左外联接返回重复

Tsql 左外联接返回重复,tsql,join,left-join,Tsql,Join,Left Join,我有一个场景,我想用交叉引用表中的另一个值覆盖一个值。它们可以是通用覆盖,也可以是特定于投资组合的覆盖。我的对照表如下所示: SEDOL Portfolio Override 1 1 Technology 1 2 Financial 1 NULL Industrial 2 NULL Technology 3 NULL Fin

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

SEDOL    Portfolio    Override
1        1            Technology
1        2            Financial
1        NULL         Industrial
2        NULL         Technology
3        NULL         Financial
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)
如果portfolio为NULL,则它是一个通用覆盖,如果它有一个portfolio编号,则它是一个特定于portfolio的覆盖

因此,我的选择将如下所示:

SEDOL    Portfolio    Override
1        1            Technology
1        2            Financial
1        NULL         Industrial
2        NULL         Technology
3        NULL         Financial
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_交叉参考的原因。我怎样才能加入到这个表中,这样我就不会得到一个重复的表,但它涵盖了特定的投资组合覆盖、通用覆盖和没有覆盖的职位?

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

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

如果SEDOL=1,公文包=1,应该采用哪种覆盖?在同一个值上有组合覆盖和通用覆盖。这就是复制的来源。这只是示例数据,这不是我的实际数据的问题。谢谢,将连接从1拆分为2似乎已经做到了这一点。