我有一個非常奇怪的問題,我有一個複雜的視圖,當我查詢特定列時返回不正確的數據。
下面有一個例如: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