为什么用LEFT JOIN获取更多记录

时间:2016-12-01 17:40:24

标签: sql database

在下面的代码中,当我执行时,我得到20条记录(注释连接表中的TranslationMaster被注释)但是当我加入更多的TranslationMaster时,我得到了23条记录。理想情况下,我应该使用LEFT JOIN获得20条记录

   SELECT 
    RecChainId=t.ChainID,
    RecSupplierId=t.SupplierID,
    RecTranstypeId=rec.TransactionTypeID,
    RecSupplierInvoiceNumber=rec.SupplierInvoiceNumber,
    RecProductDescReport=rec.ProductDescriptionReported, 
    RecRawProdIdentifier=rec.RawProductIdentifier,
    RecUPC=rec.UPC,
    RecProductId=rec.ProductID,
    RecStoreId=rec.StoreID
    into #tmpSTRecData
    from #tmpRecData t
    Inner join dbo.StoreTransactions AS rec WITH (NOLOCK)  
    on rec.ChainID=T.ChainID and rec.SupplierID=T.SupplierID 
    and rec.StoreID=T.StoreID and rec.SaleDateTime =T.InvoiceDate 
    and rec.SupplierInvoiceNumber=T.InvoiceNumber AND rec.TransactionTypeID = 32
    INNER JOIN JobProcesses AS jp
    ON jp.ProcessID = rec.ProcessID AND jp.JobRunningID = 17
    --LEFT JOIN TranslationMaster tm
    --ON rec.UPC=tm.TranslationCriteria2    
    where rec.SupplierInvoiceNumber='000377647'

即使在一张桌子上我有17张唱片,在另一张牌桌上我有7张唱片,当我左右加入时我得到了119张(17x7)唱片。

2 个答案:

答案 0 :(得分:2)

如果你的右表(在这种情况下是tm.TranslationCriteria2)有多个与你的左边结果匹配的记录(rec.UPC),你将获得更多记录。

答案 1 :(得分:2)

您似乎认为左连接不会产生比第一个表包含的行数更多的行。我将说明左连接如何导致更多行。

如果您有两个包含以下记录的表:

表人:

Column1             Column2
19880101-1111       Simon
19990101-2222       Daniel
20090101-3333       Fred 
19120101-4444       Adam

表兴趣:

Column1             Column2
19880101-1111       Football
19990101-2222       Climbing
19880101-1111       Baseball
20090101-3333       Football                    
19880101-1111       Hockey

如果您执行以下左连接:

select p.Column2, i.Column2 from Persons p
     left join Interests i on i.Column1 = p.Column1

您将获得以下结果:

Simon      Football
Simon      Baseball
Simon      Hockey
Daniel     Climbing
Fred       Football
Adam       null

您可以在Simons个人ID上获得多项匹配,因此您获得的行数比第一个表包含的数量多。