2014-02-27 47 views
1

我看不到我在這個SQL上缺少的東西,選擇部分很好,它拉6行然後我想更新這6行。它更新了10k加上我必須回滾的行。任何人都可以看到我失蹤的內容更新的地方存在

UPDATE t_ab SET uom = 3, child = 'WA' 
WHERE EXISTS (SELECT q.item, q.config FROM (
SELECT distinct item, fig FROM t_ab 
WHERE typ!= 'WA' 
MINUS 
SELECT distinct item, fig FROM t_ab 
WHERE typ= 'WA') q, hand h 
WHERE q.item = h.item 
AND h.hand > '0' 
AND q.fig <> '1') 

回答

0

這是您的查詢(清理了一下):

UPDATE t_ab 
    SET uom = 3, child = 'WA' 
    WHERE EXISTS (SELECT q.item, q.config 
        FROM (SELECT distinct item, fig 
         FROM t_ab 
         WHERE typ!= 'WA' 
         MINUS 
         SELECT distinct item, fig 
         FROM t_ab 
         WHERE typ= 'WA' 
         ) q join 
         hand h 
         on q.item = h.item 
        WHERE h.hand > '0' AND q.fig <> '1' 
       ); 

這將設置或者全部是t_ab或值沒有人的基礎上,子查詢是否返回任何值,或者沒有。

我懷疑你想有一個相關子查詢,也許是:

UPDATE t_ab 
    SET uom = 3, child = 'WA' 
    WHERE EXISTS (SELECT q.item, q.config 
        FROM (SELECT distinct item, config 
         FROM t_ab 
         WHERE typ!= 'WA' 
         MINUS 
         SELECT distinct item, config 
         FROM t_ab 
         WHERE typ= 'WA' 
         ) q join 
         hand h 
         on q.item = h.item 
        WHERE h.hand > '0' AND q.fig <> '1' and 
         q.item = t_ab.item and q.config = t_ab.config 
       ); 
+0

感謝它看起來不錯,但是做同樣的事情,試圖更新10k行,而不是6. – Demas

+0

@Demas。 。 。相關邏輯可能不正確。我不得不猜測查詢的意圖是什麼。 –

+0

謝謝,我想我會從頭開始。我正在嘗試更新所選部分獲取的缺失信息。 – Demas

0

與您的查詢的問題是,條件WHERE EXISTS是每行t_ab如此。有沒有連接回到基表。這幾乎總是不正確的。

使用,而不是:

UPDATE t_ab AS t 
SET uom = 3 
    , child = 'WA' 
FROM (
    SELECT distinct item, fig 
    FROM t_ab 
    WHERE typ <> 'WA'  -- <> ... standard SQL (!= is accepted, too) 

    MINUS 
    SELECT distinct item, fig 
    FROM t_ab 
    WHERE typ = 'WA' 
    ) q 
JOIN hand h USING (item) 
WHERE h.hand > '0' 
AND q.fig <> '1' 
AND t.item = q.item AND t.fig = q.fig;

這是假設你要更新所有行t_ab其中(item, fig)在匹配蒸餾水行你以前EXISTS半連接,現在轉變到連接表。

關鍵要素是連接表的WHERE條件。 More details in the manual.