2014-09-01 162 views
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時,否則我們沒有問題,即它的行爲如預期。

+0

嘗試改變'(stk.stock - stk.stock_reservat)'爲'(stk.stock - NVL(stk.stock_reservat,0))'看看是否有幫助。分享並享受。 – 2014-09-01 20:17:17

+0

我們已經嘗試過並且沒有正常工作 – 2014-09-02 07:09:30

+0

您是否對所有補丁程序進行了更新?我記得10g有問題,正如你所注意到的,11更穩定。 – 2014-09-02 10:57:58

回答

0

你的查詢可以使用子查詢分解條款,如被簡化:

WITH ns AS (SELECT r.empresa, r.referencia, count(*) as CNT_NUMS_SERIE 
       FROM ref_numeros_serie n 
       INNER JOIN emp_referencies r 
       r.empresa = n.empresa AMD 
       r.referencia = n.referencia 
       WHERE n.diposit = 1 AND 
        NVL(n.actiu, 'N') = 'S' 
       GROUP BY r.empresa, 
         r.referencia) 
SELECT ref.referencia, 
     ref.descripcio, 
     stock_reservat, 
     stock, 
     stock_p_rebre, 
     ns.CNT_NUMS_SERIE 
    FROM emp_referencies ref 
    INNER JOIN ref_stk_dip_acu stk 
    ON stk.empresa = ref.empresa AND 
     stk.referencia = ref.referencia 
    INNER JOIN ns 
    ON ns.empresa = ref.empresa AND 
     ns.referencia = ref.referencia 
    WHERE ref.empresa = 1 AND 
     ref.referencia = '1B' AND 
     stk.diposit = 1 AND 
     -- Relevant part 
     (stk.stock - NVL(stk.stock_reservat, 0)) <> ns.CNT_NUMS_SERIE 
     -- End of relevant part 
    GROUP BY ref.empresa, 
      ref.referencia, 
      ref.descripcio, 
      stk.stock, 
      stk.stock_reservat, 
      stock, 
      stock_p_rebre 

這可以讓你拉共同表達(SELECT COUNT(*)...)出來,並把它作爲一個單獨的表。我認爲它使查詢更容易閱讀,並可能節省一些執行時間。

分享和享受。