sql - SQL合并中发生无意的交叉连接

标签 sql t-sql join merge

我有两个表,我想将它们与以下列连接:

Tables: #IndexDecomposition; Constituent.

Rows: Identifier; CUSIP; ISIN; SEDOL.

这都是更大的 MERGE 语句的一部分,现在我认为交叉连接发生在 INSERT 语句上:

MERGE indexdecomp.ConstituentWeighting targ
USING (#IndexConstituents src
       INNER JOIN indexDecomp.Constituent c WITH (NOLOCK) on 
        ((c.Identifier = src.Identifier) OR (c.Identifier IS NULL AND src.Identifier IS NULL))
           AND ((c.CUSIP = src.CUSIP) OR (c.CUSIP IS NULL AND src.CUSIP IS NULL))
           AND ((c.ISIN = src.ISIN) OR (c.ISIN IS NULL AND src.ISIN IS NULL))
           AND ((c.SEDOL = src.SEDOL) OR (c.SEDOL IS NULL AND src.SEDOL IS NULL)))
ON (    targ.ConstituentId = c.Id 
    AND targ.AsOfDate = src.Date
    AND ((targ.Weighting = src.Weighting) OR (targ.Weighting IS NULL AND src.Weighting IS NULL))
    AND ((targ.TotalSharesHeld = src.TotalSharesHeld) OR (targ.TotalSharesHeld IS NULL AND src.TotalSharesHeld IS NULL))
    AND ((targ.SharesOutstanding = src.SharesOutstanding) OR (targ.SharesOutstanding IS NULL AND src.SharesOutstanding IS NULL))
    AND ((targ.NotionalValue = src.NotionalValue) OR (targ.NotionalValue IS NULL AND src.NotionalValue IS NULL))
    AND ((targ.MarketValue = src.MarketValue) OR (targ.MarketValue IS NULL AND src.MarketValue IS NULL))
    AND ((targ.MarketCap = src.MarketCap) OR (targ.MarketCap IS NULL AND src.MarketCap IS NULL))
    AND ((targ.LastTrade = src.LastTrade) OR (targ.LastTrade IS NULL AND src.LastTrade IS NULL))
    AND ((targ.Earnings = src.Earnings) OR (targ.Earnings IS NULL AND src.Earnings IS NULL))
    AND ((targ.PeRatio = src.PeRatio) OR (targ.PeRatio IS NULL AND src.PeRatio IS NULL))
    AND ((targ.Face = src.Face) OR (targ.Face IS NULL AND src.Face IS NULL)))
WHEN NOT MATCHED BY TARGET THEN
    INSERT (
         ConstituentID
        ,AsOfDate
        ,Weighting
        ,TotalSharesHeld
        ,SharesOutstanding
        ,NotionalValue
        ,MarketValue
        ,MarketCap
        ,LastTrade
        ,Earnings
        ,PeRatio
        ,Face
        ,ModifiedBy
        ,ModifiedDate
        ,CreatedBy
        ,CreatedDate
    )
    VALUES (
         c.Id
        ,src.Date
        ,src.Weighting
        ,src.TotalSharesHeld
        ,src.SharesOutstanding
        ,src.NotionalValue
        ,src.MarketValue
        ,src.MarketCap
        ,src.LastTrade
        ,src.Earnings
        ,src.PeRatio
        ,src.Face
        ,'user'
        ,getdate()
        ,'user'
        ,getdate()
    )
;

最佳答案

我认为您最近尝试的唯一问题是它没有清除所有空值的组合(即所有四个 ID 都为空的误报)。您可以通过要求四个标识符中至少有一个必须为非空来修复此问题,如下所示:

SELECT *
FROM xTradeCapture.staging.IndexDecomposition src
INNER JOIN indexDecomp.Constituent c WITH (NOLOCK) on 
(((c.Identifier = src.Identifier) OR (c.Identifier IS NULL AND src.Identifier IS NULL))
AND ((c.CUSIP = src.CUSIP) OR (c.CUSIP IS NULL AND src.CUSIP IS NULL))
AND ((c.ISIN = src.ISIN) OR (c.ISIN IS NULL AND src.ISIN IS NULL))
AND ((c.SEDOL = src.SEDOL) OR (c.SEDOL IS NULL AND src.SEDOL IS NULL))
AND (c.Identifier IS NOT NULL OR c.CUSIP IS NOT NULL OR c.ISIN IS NOT NULL OR c.SEDOL IS NOT NULL))

关于sql - SQL合并中发生无意的交叉连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13921721/

相关文章:

sql - 选择不同的

sql - Cross Join 有什么用?

MySQL 4 表全连接只显示共享列一次

sql - 是否有任何 T-SQL 库可以将其转变为面向对象?

sql - 设置日期是从 getdate() 的一年开始吗?

SQL——从给定的开始日期计算结束日期,并带有任意中断

sql - 尝试确定特定零件号的下一个机器操作是什么

mysql - 在 FK 中连接具有空值的表

sql - 针对多个版本的 SQL Server 进行软件测试

mysql - 从 MySQL 中所属的所有组中选择用户