你能解释一下为什么在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
这两个查询不相似吗?
谢谢!
答案 0 :(得分:2)
添加加号的列是“外”侧。在第二个查询中,(+)被添加到BillDetailsTax.BillRow。这意味着允许BillDetailsTax
中的值丢失。
因此,基本上,第二个查询是LEFT OUTER JOIN
上的BillDetailsTax
,第一个查询是RIGHT OUTER JOIN
上的BillDetailsTax
。
我认为实际上第二个查询更有意义。它没有返回任何内容,因为没有ID为602237且折扣的账单。