ABC 来自数据库 qry,来源相同,但 AB 和 C 的每个 qry 都有不同的过滤器
这可能允许您在任何 A、B 或 C 都没有拾取的行中发现一个模式,尽管您仍然需要计算出您期望每行(或行模式)的三个查询中的哪一个被接走,以及为什么他们被错过了。
由于具有附加过滤器的三个查询的计数总和低于没有这些过滤器的查询的计数,因此过滤器本身似乎存在差距。如果我不得不猜测,那么我首先要寻找的是对null
值的错误处理,试图将它们等同起来(因为null
既不等于也不等于任何东西,甚至它本身)。但这显然是推测,如果没有看到过滤器并且不知道哪些列可以为空,这并不是很有帮助。
您可以隔离未显示的 1163 行,方法是使用minus
查找“total”查询拾取的行,并且不包含在任何产生 A、B 和 C 的行中;就像是:
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>
不过,我很好奇您distinct
在初始查询中是否有 a,因为它表明您正在计算 switch 调用是来自而不是调用本身。这也可能意味着计数不应该相加——尽管在这种情况下,我可能期望 A+B+C 比简单的要大,因为可能存在重叠——并且select *
实际上可能返回超过 1163 行;在这种情况下,您可能只想选择您认为可能有问题的列。
顺便说一句,如果creation_date
被索引,那么你可能会得到更好的性能where creation_date >= date '2012-07-01' and creation_date < date '2012-08-01'
,因为trunk()
函数会阻止索引被使用。不过对你来说可能不是问题。