2017-09-05 102 views
0

我測試此UPDATE語句更新我們的數據庫中所有4%,8%和9%的部分。我試圖獲取QTY_MULTIPLE值來匹配每層的CASES值。更新與存在

所以,REGEXP_LIKE,最終將閱讀:

> Regexp_like (sp.part_no, '^4|^8|^9') 

它現在不會,因爲我測試三個特定部位。我想確保聲明的其餘部分按照其應有的方式工作。

這裏就是我與測試:

UPDATE SALES_PART_TAB sp 
SET sp.qty_multiple = (SELECT cases_per_layer 
          FROM HH_INV_PART_CHARS 
          WHERE sp.part_no = HH_INV_PART_CHARS.part_no AND 
            sp.contract = HH_INV_PART_CHARS.contract) 
WHERE Regexp_like (sp.part_no, '^410-0017|^816-0210|^921-0003') AND 
     EXISTS 
     (SELECT sp.contract, 
     sp.part_no, 
     sp.qty_multiple, 
     HH_INV_PART_CHARS.cases_per_layer 
     FROM SALES_PART sp 
       inner join HH_INV_PART_CHARS 
         ON sp.part_no = HH_INV_PART_CHARS.part_no AND 
          sp.contract = HH_INV_PART_CHARS.contract 
     WHERE sp.qty_multiple != HH_INV_PART_CHARS.cases_per_layer); 

當我運行該語句,它更新16行。

但是,我期待它更新15行。我得出這個結論通過運行下面的SELECT語句:

SELECT sp.contract, 
     sp.catalog_no, 
     sp.qty_multiple, 
     HH_INV_PART_CHARS.cases_per_layer 
FROM SALES_PART sp 
     inner join HH_INV_PART_CHARS 
       ON sp.part_no = HH_INV_PART_CHARS.part_no AND 
        sp.contract = HH_INV_PART_CHARS.contract 
WHERE sp.qty_multiple != HH_INV_PART_CHARS.cases_per_layer AND 
     Regexp_like (sp.part_no, '^410-0017|^816-0210|^921-0003') 

認爲我遇到的問題是UPDATE語句更新,其中來自sales_part表PART_NO和合同上HH_INV_PART_CHARS存在的所有行。它不限制qty_multiple不等於cases_per_layer(這是我想要的)的更新部分。

我現在有點難過。我一直試圖在這兩個子查詢上工作,但我沒有任何運氣來確定問題出在哪裏。

+2

'update'查詢中的'Regexp_like(sp.part_no,...)'指的是'SALES_PART_TAB.spart_no',而在第二個查詢中則指向'SALES_PART.spart_no'。迷霧的原因之一是你在同一個查詢中重新定義別名'sp',所以'exists'子查詢不會以任何*方式與正在更新的記錄相關聯。這意味着如果你放棄'exists'條件,你仍然會更新16條記錄。這似乎不太可能,這是你想要的。 – trincot

+0

這樣做。謝謝你清理那個。 – krebshack

+0

好的,我發佈它作爲答案。 – trincot

回答

3

更新查詢中的Regexp_like (sp.part_no,...)指的是SALES_PART_TAB.spart_no,而在第二個查詢中指的是SALES_PART.spart_no

迷霧的原因之一是您在同一個查詢中重新定義別名sp,因此exists子查詢與任何方式都不會關聯到正在更新的記錄。這意味着如果你丟掉exists條件,你仍然會更新16條記錄。這似乎不太可能,這是你想要的。

使用不同的別名,因此您可以區分要引用的表。