SQL Right Joins vs Left Joins

时间:2015-10-06 21:01:32

标签: sql-server

鉴于下面此查询返回的总行数必须等于“发票”表中的行数

SELECT VendorName, InvoiceNumber
FROM Invoices
LEFT JOIN Vendors ON Invoices.VendorsID = Vendors.VendorID

当您使用LEFT关键字替换RIGHT关键字时,为什么此查询返回的总行数不等于Vendors表中的行数?

3 个答案:

答案 0 :(得分:2)

简单的答案是因为这意味着“右侧”(在这种情况下为>> fprintf('\nFinal conversions (percent):\n\t\tH2S: %f\n\t\tCOS: %f\n\t\tCS2: %f\n\n',[1,1],[1,1],[1,1]) Final conversions (percent): H2S: 1.000000 COS: 1.000000 CS2: 1.000000 Final conversions (percent): H2S: 1.000000 COS: 1.000000 CS2: 1.000000 )的每条记录都会在结果中表示。

因此,如果您的供应商没有任何发票,它将显示在Vendors中,但不会显示在RIGHT JOIN中(因为“左侧”没有匹配表)。

答案 1 :(得分:2)

您的供应商表是1对多关系中的从属表,因此当您在发票和供应商上执行RIGHT联接时,您将在关系中为每个发票+供应商组合获得1行,另外还有1行发票表中没有发票记录的每个供应商。

所以,假设您有三家供应商,其中有三份发票。

供应商1有2张发票
供应商2有1张发票
供应商3有0个发票

使用此数据,RIGHT JOIN将返回4行:供应商1为两行,供应商2为一行,供应商为3行。

This fiddle提供了我上面所描述的一个例子。

答案 2 :(得分:1)

右连接可确保右表中的所有行都出现在结果中。

但是,如果同一供应商有3张发票,结果集中仍然有3行,而不是1.那就是联接的工作方式:)