-1

你能解释一下我为什么在 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 

这两个查询不相似吗?

谢谢!

4

1 回答 1

2

添加加号的列是“外”侧。在您的第二个查询中,将 (+) 添加到 BillDetailsTax.BillRow。这意味着BillDetailsTax允许缺少来自的值。

所以,本质上,第二个查询是 a LEFT OUTER JOINon BillDetailsTax,第一个查询是 a RIGHT OUTER JOINon BillDetailsTax

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

于 2013-01-17T12:56:04.313 回答