2016-06-07 40 views
0

以下是我到目前爲止的查詢,我明白爲什麼它不工作...只是很難形成解決方案。根據其他表列值更新多行

UPDATE wrkque 
SET locacc = (SELECT locmst.locacc 
      FROM locmst, 
       wrkque 
      WHERE locmst.stoloc = wrkque.srcloc 
      AND wrkque.oprcod = 'TRN') 
WHERE wrkque.oprcod = 'TRN' 
AND wrkque.srcloc IN (SELECT locmst.stoloc 
         FROM locmst, 
          wrkque 
         WHERE locmst.stoloc = wrkque.srcloc) 

內部查詢返回多行。我相信我需要按類型查詢做一個分區,但有點不確定。

本質上,我需要更新wrkque表,以便更新所有屬於「TRN」(轉移)的行實例以反映locmst表中的「locacc」(位置訪問)。

將兩個錶行連接到彼此的關鍵是locmst.stoloc和wrkque.srcloc。

任何幫助非常感謝。

回答

2

試試這個:

UPDATE wrkque 
SET locacc = (SELECT locmst.locacc 
       FROM locmst 
       WHERE locmst.stoloc = wrkque.srcloc) 
WHERE wrkque.oprcod = 'TRN' 

內查詢需要被引用到外部查詢,我們在這裏所做其中:WHERE locmst.stoloc = wrkque.srcloc。我們不需要內部查詢中的連接,我們只需要參考。

編輯的存在:

戈登在他的回答中指出,你應該包括在外部查詢的EXISTS相關條款以及:

UPDATE wrkque 
SET locacc = (SELECT locmst.locacc 
       FROM locmst 
       WHERE locmst.stoloc = wrkque.srcloc) 
WHERE wrkque.oprcod = 'TRN' 
AND EXISTS (SELECT locmst.stoloc 
      FROM locmst 
      WHERE locmst.stoloc = wrkque.srcloc) 

沒有這一點,是做任何行不符合locmst.stoloc = wrkque.srcloc(存在於wrkque中但不在locmst中)將具有locacc設置爲null。如果每一行都存在於兩個表中,則可以將其忽略,但最好總是包含它。

+1

嘖,感謝阿龍。讓我們只是說,我在想這個...大聲笑 – user3642066

2

這些類型的更新很棘手。您的根本問題是,當您應該使用關聯子句時,子查詢中有join。您需要既爲setwhere做到這一點:

UPDATE wrkque 
    SET locacc = (SELECT locmst.locacc 
        FROM locmst 
        WHERE locmst.stoloc = wrkque.srcloc 
       ) 
    WHERE wrkque.oprcod = 'TRN' AND 
      EXISTS (SELECT locmst.stoloc 
        FROM locmst 
        WHERE locmst.stoloc = wrkque.srcloc 
       ); 

說了這麼多,你爲什麼存儲locaccwrkque表?您始終可以使用join獲取適當的值。這樣做有很好的理由,比如你可能正在初始化值,然後被覆蓋。但是在大多數情況下,不需要在兩個地方存儲相同的信息。

+0

謝謝!這個也可以。 – user3642066

0

試試這個

UPDATE (SELECT locmst.locacc newOne, wrkque.locacc oldOne 
      FROM locmst, wrkque 
      WHERE locmst.stoloc = wrkque.srcloc 
      AND wrkque.oprcod = 'TRN') t 
SET t.oldOne = t.newOne;