ABC はデータベース qry から取得され、ソースは同じですが、AB と C の各 qry に対して異なるフィルターが多数含まれています。
これにより、A、B、または C のいずれによっても取得されない行のパターンを見つけることができるかもしれませんが、各行 (または行のパターン) を期待する 3 つのクエリのどれを解決する必要があります。にピックアップされたこと、およびなぜ見逃したのか。
追加のフィルターを使用した 3 つのクエリのカウントの合計は、これらのフィルターを使用しないクエリのカウントよりも少ないため、フィルター自体にギャップがあるようです。推測する必要がある場合、最初に探すのは、null
値の誤った処理であり、それらを同等にしようとします(null
は、それ自体でさえも、等しくないか、等しくないため)。しかし、これは明らかに憶測であり、フィルターを確認せずに、どの列が null になる可能性があるかを知らなければ、あまり役に立ちません。
minus
'total' クエリによって取得され、A、B、および C を生成する行のいずれにも含まれない行を見つけるために使用することで、表示されていない 1163 行を分離することができます。何かのようなもの:
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
minus
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
and <additional filters for A>
minus
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
and <additional filters for B>
minus
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
and <additional filters for C>
ただし、最初のクエリに a が含まれていることに興味がありdistinct
ます。これは、呼び出し自体ではなく、スイッチ呼び出しが行われた回数を数えていることを示唆しているためです。また、カウントが加算されないことを意味する場合もあります-その場合、オーバーラップの可能性があるため、A + B + Cが単純なものよりも大きくなると予想されますが、select *
実際には1163行を超える可能性があります; この場合、問題があると思われる列のみを選択したい場合があります。
ちなみに、 にcreation_date
インデックスが付けられている場合、 を使用するとパフォーマンスが向上する可能性があります。これwhere creation_date >= date '2012-07-01' and creation_date < date '2012-08-01'
は、trunk()
関数がインデックスの使用を防止するためです。しかし、あなたにとっては問題ではないかもしれません。