2
我們正在使用Oracle 10g XE,我們發現下面的查詢不返回任何值:數學運算
SELECT ref.referencia,
ref.descripcio,
stock_reservat,
stock,
stock_p_rebre,
(SELECT count(*)
FROM ref_numeros_serie num
WHERE num.empresa=ref.empresa AND
num.referencia=ref.referencia AND
num.diposit=1 AND
nvl(num.actiu,'N')='S') cnt_nums_serie
FROM emp_referencies ref,
ref_stk_dip_acu stk
WHERE ref.empresa=1 AND
ref.referencia='1B' AND
stk.empresa=ref.empresa AND
stk.referencia=ref.referencia AND
stk.diposit=1 AND
-- Relevant part
(stk.stock - stk.stock_reservat) <> (SELECT count(*)
FROM ref_numeros_serie num
WHERE num.empresa=ref.empresa AND
num.referencia=ref.referencia AND
num.diposit=1 AND
nvl(num.actiu,'N')='S')
-- End of relevant part
GROUP BY ref.empresa,
ref.referencia,
ref.descripcio,
stk.stock,
stk.stock_reservat,
stock,
stock_p_rebre
所以減法和子查詢之間的比較是假的。但是,如果我們將子查詢和減法替換爲這樣:
SELECT ref.referencia,ref.descripcio,
stock_reservat,
stock,
stock_p_rebre,
(SELECT count(*)
FROM ref_numeros_serie num
WHERE num.empresa=ref.empresa AND
num.referencia=ref.referencia AND
num.diposit=1 AND
nvl(num.actiu,'N')='S') cnt_nums_serie
FROM emp_referencies ref,
ref_stk_dip_acu stk
WHERE ref.empresa=1 AND
ref.referencia='1B' AND
stk.empresa=ref.empresa AND
stk.referencia=ref.referencia AND
stk.diposit=1 AND
-- Relevant part
(SELECT count(*)
FROM ref_numeros_serie num
WHERE num.empresa=ref.empresa AND
num.referencia=ref.referencia AND
num.diposit=1 AND
nvl(num.actiu,'N')='S') <> (stk.stock - stk.stock_reservat)
-- End of relevant part
GROUP BY ref.empresa,
ref.referencia,
ref.descripcio,
stk.stock,
stk.stock_reservat,
stock,
stock_p_rebre
比較結果是真實的,我們得到結果。
我們已經嘗試了以下情況:
- 卸下減法因此比較的左邊部分的第二部分是
stk.stock
:我們得到的成績,正確 - 通過改變減法的第二部分許多這樣的
stk.stock-2
:我們得到的成績,正確 - 交換比較的左邊和右邊部分,上面解釋說:我們得到的成績,正確
- 更改算術運算符這樣
(stk.stock+stk.stock_reservat) <> subquery
:沒有結果,不正確 - 由許多這樣
(stk.stock-stk.stock_reservat) <> 2
更改子查詢:我們得到
我們嘗試了這些案件與10g的非XE數據庫結果,正確的,它具有相同的行爲。另一方面,使用11g,它工作得很好。
因此,我們的結論是,使用Oracle 10g時,兩列之間的算術運算與子查詢之間的比較僅在子查詢位於左側並且右側的操作有效。有沒有人有類似的問題,你是如何解決/修復它?
編輯:我想補充說,這發生在子查詢結果爲0時,否則我們沒有問題,即它的行爲如預期。
嘗試改變'(stk.stock - stk.stock_reservat)'爲'(stk.stock - NVL(stk.stock_reservat,0))'看看是否有幫助。分享並享受。 – 2014-09-01 20:17:17
我們已經嘗試過並且沒有正常工作 – 2014-09-02 07:09:30
您是否對所有補丁程序進行了更新?我記得10g有問題,正如你所注意到的,11更穩定。 – 2014-09-02 10:57:58