这两个查询有什么区别?

时间:2013-01-17 11:19:16

标签: sql oracle

你能解释一下为什么在Oracle中这个查询会返回一些内容:

SELECT discounts.DiscountId,
       discounts.ShortDisplay,
       discounts.Display,
       discounts.Description,
       BillDetails.BillId,
       BillDetails.BillRow,
       BillDetails.BillId  AS BillIdTax,
       BillDetails.BillRow AS BillRowTax,
       BillDetails.FEDERAL_TAX_POSTPAID,
       BillDetails.TOTAL_RATE
FROM   discounts
       INNER JOIN BillDetails
         ON discounts.DiscountId = BillDetails.DiscountId
       RIGHT OUTER JOIN BillDetailsTax
         ON BillDetails.BillId = BillDetailsTax.BillId
            AND BillDetails.BillRow = BillDetailsTax.BillRow
WHERE  BillDetails.BillId = 602237 

这一点都没有:

SELECT discounts.DiscountId,
       discounts.ShortDisplay,
       discounts.Display,
       discounts.Description,
       BillDetails.BillId,
       BillDetails.BillRow,
       BillDetails.BillId  AS BillIdTax,
       BillDetails.BillRow AS BillRowTax,
       BillDetails.FEDERAL_TAX_POSTPAID,
       BillDetails.TOTAL_RATE
FROM   BillDetails,
       BillDetailsTax BillDetails,
       discounts
WHERE  BillDetails.BillRow = BillDetailsTax.BillRow(+)
       AND BillDetails.BillId = BillDetailsTax.BillId(+)
       AND BillDetails.DiscountId = discounts.DiscountId
       AND BillDetails.BillId = 602237 

这两个查询不相似吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

添加加号的列是“外”侧。在第二个查询中,(+)被添加到BillDetailsTax.BillRow。这意味着允许BillDetailsTax中的值丢失。

因此,基本上,第二个查询是LEFT OUTER JOIN上的BillDetailsTax,第一个查询是RIGHT OUTER JOIN上的BillDetailsTax

我认为实际上第二个查询更有意义。它没有返回任何内容,因为没有ID为602237且折扣的账单。