我有一个非常奇怪的问题,我有一个复杂的视图,当我在特定列上查询时返回错误的数据。
这是一个例子:

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虚拟列的列上有一个旧索引。我删除了该索引,查询开始按预期方式运行。我仍然担心该索引如何影响查询,但至少解决了我眼前的问题。

谢谢你的帮助!

07-24 09:54
查看更多