【问题标题】:Why left join is not giving distinct result?为什么左连接没有给出明显的结果?
【发布时间】:2012-12-11 17:26:31
【问题描述】:

我有以下 sql 查询,但我的左连接没有给我明显的结果,请帮助我追踪。

       SELECT  DISTINCT
                    Position.Date,
                    Position.SecurityId,
                    Position.PurchaseLotId,
                    Position.InPosition,
                    ISNULL(ClosingPrice.Bid, Position.Mark) AS  Mark
        FROM
                Fireball_Reporting.dbo.Reporting_DailyNAV_Pricing POSITION WITH (NOLOCK, READUNCOMMITTED)
                LEFT JOIN Fireball.dbo.AdditionalSecurityPrice ClosingPrice WITH (NOLOCK, READUNCOMMITTED) ON
                            ClosingPrice.SecurityID = Position.PricingSecurityID AND
                            ClosingPrice.Date = Position.Date AND
                            ClosingPrice.SecurityPriceSourceID = @SourceID AND
                            ClosingPrice.PortfolioID IN (5,6)  

 WHERE
        DatePurchased > @NewPositionDate AND
        Position.Date = @CurrentPositionDate AND
        InPosition = 1 AND

        Position.PortfolioId IN ( 
                                SELECT 
                                    PARAM 
                                FROM 
                                    Fireball_Reporting.dbo.ParseMultiValuedParameter(@PortfolioId, ',') 
                                ) AND
        (
        Position > 1 OR
        Position < - 1
        )

现在,当我使用 LEFT JOIN ISNULL(ClosingPrice.Bid, Position.Mark) AS Mark 和 LEFT JOIN 时,它给了我更多没有具有多个投资组合 ID 的记录 例如(5,6)

如果我将portfolioID =5 给出结果为120 records

如果我将portfolioID =6 给出结果为20 records

当我输入portfolioID = (5,6) 时,它应该给我140 records 但它给出的结果为350 records,这是错误的。 :(

发生这种情况是因为当我使用 LEFT JOIN 时,没有 PurchaseLotID 的条件,因为表 Fireball.dbo.AdditionalSecurityPrice ClosingPrice 没有列 PurchaseLotID,所以它给了我其他记录,也有相同的 purchaseLotID 价格不同。

但我不想要那些记录

我怎样才能消除这些记录?

【问题讨论】:

  • 你有重复的行吗?
  • 虽然您在DailyLoanAndCashPosition 中使用了DISTINCT,但NAVImpact 中的PurchaseLotId 的20 个值必须出现在DailyLoanAndCashPosition 的70 个不同行中,但其他列的差异会导致70 行仍然是独一无二的。
  • 它显示相同purchaselotid的重复记录,但我们正在进行内部连接,那为什么它会重复记录?什么是解决方案?请帮忙
  • 内连接不消除重复,只记录没有匹配值的地方。如果要消除重复,请使用SELECT DISTINCT
  • @DigitalD 谢谢,但我已经使用了 DISTINCT 然后它也给了我重复 :(

标签: sql sql-server sql-server-2008


【解决方案1】:

每个DailyLoanAndCashPosition.PurchaseLotId = NAVImpact.PurchaseLotId 获得一个条目

这意味着您必须有更多具有相同 PurchaseLotId 的条目

【讨论】:

  • 是的,它向我显示相同 purchaselotid 的重复记录,但我们正在进行内部连接,那为什么它会重复记录?什么是解决方案?请帮忙
【解决方案2】:

最可能的原因是左连接产生重复的 PurchaseLotIds。了解您是否在内连接的左侧执行 select distinct(PurchaseLotId) 的最佳方法。

【讨论】:

  • 左连接是产生重复 PurchaseLotIds 的子查询,第二个不是(因为您按该列分组)。您应该解决第一个连接,尝试生成唯一的 PurchaseLotIds。我会看看查询,所以我可以给你一个提示。
  • AdditionalSecurityPrice 表是否有 PurchaseLotId 列?如果没有,请发布该表的列列表。
  • 就我们目前所知,问题是LEFT JOIN左侧表上的一些记录匹配LEFT JOIN右侧表上的多条记录。那么,什么
  • 就我们目前所知,问题是LEFT JOIN左侧表上的一些记录匹配LEFT JOIN右侧表上的多条记录。所以,你需要做的是在右侧的表上添加一个 group by 子句,它应该看起来像:GROUP BY SecurityID,Date,SecurityPriceSourceID,PortfolioID
  • 我的意思是你应该替换 LEFT JOIN Fireball.dbo.AdditionalSecurityPrice ClosingPrice WITH (NOLOCK, READUNCOMMITTED) ON 为 LEFT JOIN (SELECT SecurityID,Date,SecurityPriceSourceID,PortfolioID,Bid FROM Fireball.dbo。 AdditionalSecurityPrice WITH (NOLOCK, READUNCOMMITTED) GROUP BY SecurityID,Date,SecurityPriceSourceID,PortfolioID,Bid) ClosingPrice ON ClosingPrice.SecurityID = Position.PricingSecurityID AND ClosingPrice.Date = Position.Date AND ClosingPrice.SecurityPriceSourceID = @SourceID AND ClosingPrice.PortfolioID IN (5 ,6)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2012-12-06
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多