2016-04-07 42 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

是的,它肯定会。另外,如果我的查询帮助回答您的问题,请将我的答案标记为正确答案。 –