我有一个非常奇怪的问题,我有一个复杂的视图,当我查询特定列时返回不正确的数据。
下面有一个例如:oracle查询结果不一致
select empname
, has_garnishment
from timecard_v2
where empname = 'Testerson, Testy';
此返回单个结果 'Testerson,暴躁', 'N'
但是,如果我使用查询:
select empname
, has_garnishment
from timecard_v2
where empname = 'Testerson, Testy'
and has_garnishment = 'Y';
此返回单结果'Testerson,Testy','Y'
第二个查询应该返回第一个查询的一个子集,但它返回一个不同的答案。
当我使用查询:
select empname
, has_garnishment
from timecard_v2
where empname = 'Testerson, Testy'
and has_garnishment = 'N';
我没有得到任何结果
我已经解剖视图,并确定视图定义的这部分是哪里出了问题产生和存在的问题,即使我把sql定义作为一个直接查询来运行(注意,为了清楚起见,我删除了除了感兴趣部分外的所有select子句,在完整查询中需要所有连接的表):
SELECT
e.fullname empname ,
NVL2(ded.has_garn, 'Y', 'N') has_garnishment
FROM timecard tc ,
orderdetail od ,
orderassign oa ,
employee e ,
employee3 e3 ,
customer10 c10 ,
order_misc om,
(SELECT COUNT(*) has_garn,
v_ssn
FROM deductions
WHERE yymmdd_stop = 0
OR (LENGTH(yymmdd_stop) = 7
AND to_date(SUBSTR(yymmdd_stop, 2), 'YYMMDD') > sysdate)
GROUP BY v_ssn
) ded
WHERE oa.lrn(+) = tc.lrn_order
AND om.lrn(+) = od.lrn
AND od.orderno = oa.orderno
AND e.ssn = tc.ssn
AND c10.custno = tc.custno
AND e.lrn = e3.lrn
AND e.ssn = ded.v_ssn(+)
关于'ded'子查询的定义需要注意的一件事。 v_ssn字段是扣除表上的虚拟字段。
我不是软件开发人员的DBA,但我们最近失去了我们的DBA,新的仍在加快速度,所以我试图调试这个问题。这就是说,请解释一些更彻底的东西,然后你会为一位神谕专家。
谢谢
DED子查询似乎可以使用某些格式和注释来帮助使其更易于支持。但我怀疑我的麻烦阅读SQL与这个问题有任何关系。为了获得更多信息,请尝试使用视图SQL语句并添加“empname ='Testerson,Testy'”限制器。你会得到什么结果? – Jay 2010-04-21 17:24:58
我会感兴趣的看到执行计划的两个查询给出不一致的结果。在SQLPlus中,输入'set autotrace traceonly explain',然后执行查询。 – 2010-04-21 18:10:58
我想知道当你输入第一个含有had_garnishment ='N'的查询时,你会得到什么 – MJB 2010-04-21 19:31:04