2016-04-07 40 views
0

我無法獲得以下與Oracle相關的查詢以僅對記錄的一個子部分執行更新。目前它更新所有記錄。相關更新查詢

我有一個表(TBL_REQUESTS),它看起來像:

request_id employee_id status 
------------------------------------ 
1    1000 
1    1001 
2    1003 
2    1004 
2    1005 
3    1006 

我有一個觀點(VW_STATUS),它看起來像:

employee_id status 
--------------------- 
1000   failed 
1001   closed 
1002   open 
1003   open 
1004   close 
1005   open 
1006   open 

我試圖寫一個UPDATE語句會使用TBL_REQUESTS.request_id等於傳遞值的VW_STATUS中的相應狀態更新TBL_REQUESTS中員工的狀態字段。另外一個問題是,每個員工在VW_STATUS中可能會有超過1條記錄,但如果出現問題,我總是可以尋找一種方法在VIEW中解決這個問題。

這種嘗試在TBL_REQUESTS更新的每一行:

UPDATE TBL_REQUESTS r1 
SET r1.status = 
    (SELECT s.status 
    FROM VW_STATUS s 
    INNER JOIN TBL_REQUESTS r2 ON s.employee_id = r2.employee_id 
    WHERE rd2.request_id = 2) 
WHERE EXISTS 
    (SELECT s.status 
    FROM VW_STATUS s 
    INNER JOIN TBL_REQUESTS r2 ON s.employee_id = r2.employee_id 
    WHERE rd2.request_id = 2) 

回答

1

我認爲更好的方式來寫這個查詢可能是這樣 -

UPDATE TBL_REQUESTS r1 
SET r1.status = 
    (SELECT s.status 
    FROM VW_STATUS s 
    INNER JOIN TBL_REQUESTS r2 ON s.employee_id = r2.employee_id 
    WHERE rd2.request_id = 2) 
WHERE r1.employee_id in 
    (SELECT s.employee_id 
    FROM VW_STATUS s 
    INNER JOIN TBL_REQUESTS r2 ON s.employee_id = r2.employee_id 
    WHERE rd2.request_id = 2) 

這應該限制查詢只在employee_ids運行有request_id = 2。

+1

這看起來比我的版本更好 - 但是,如果員工出現在多個請求中,是不是也會在那裏更新它們呢?這會緩解嗎? 'UPDATE TBL_REQUESTS R1 SET r1.status = (SELECT s.status FROM VW_STATUS小號 INNER JOIN TBL_REQUESTS R2上s.employee_id = r2.employee_id WHERE rd2.request_id = 2) WHERE r1.employee_id在 (SELECT s.employee_id FROM VW_STATUS s INNER JOIN TBL_REQUESTS r2 ON s.employee_id = r2.employee_id WHERE rd2.request_id = 2)和r1.request_id = 2'編輯 - 沒有意識到輸入保存的註釋。 – MidnightThoughtful

+0

是的,它肯定會。另外,如果我的查詢幫助回答您的問題,請將我的答案標記爲正確答案。 –