为什么离开加入并没有给出明显的结果?

时间:2012-12-11 17:26:32

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

我有以下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且具有不同价格的人

但我不想要那些记录

  

如何消除这些记录?

2 个答案:

答案 0 :(得分:3)

DailyLoanAndCashPosition.PurchaseLotId = NAVImpact.PurchaseLotId

可获得一个条目

这意味着您必须使用相同的PurchaseLotId进行更多的委托

答案 1 :(得分:1)

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