我有一个非常奇怪的问题,我有一个复杂的视图,当我在特定列上查询时返回错误的数据。
这是一个例子:
select empname
, has_garnishment
from timecard_v2
where empname = 'Testerson, Testy';
这将返回单个结果'Testerson,Testy','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,而新的DBA仍在快速发展,因此我试图调试此问题。话虽如此,请比其他Oracle专家更全面地解释一下事情。
谢谢
最佳答案
原来问题是索引冲突。建立v_ssn虚拟列的列上有一个旧索引。我删除了该索引,查询开始按预期方式运行。我仍然担心该索引如何影响查询,但至少解决了我眼前的问题。
谢谢你的帮助!