-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 

これらの 2 つのクエリは似ていませんか?

ありがとうございました!

4

1 に答える 1

2

プラスが追加される列は「外側」側です。2 番目のクエリでは、(+) が BillDetailsTax.BillRow に追加されます。これは、 からの値BillDetailsTaxが欠落していてもよいことを意味します。

したがって、基本的に、2 番目のクエリはLEFT OUTER JOINon でBillDetailsTaxあり、最初のクエリはRIGHT OUTER JOINonBillDetailsTaxです。

実際には、2 番目のクエリの方が理にかなっていると思います。ID 602237 と割引の請求書が存在しないため、何も返されません。

于 2013-01-17T12:56:04.313 に答える