select emp_id, emp_dept, emp_name
from employee
where emp_id in (123, 234);
emp_id emp_dept emp_name
*****************************
123 222 1234
123 222 5678
123 222 9101
234 222 1011
234 222 1112
234 222 1213
这里每个emp_id有3条记录。 我想要一个查询来更新emp_dept,这样三条记录中只有一条记录会被更新为555(它可以是任何记录无关紧要),另外两条记录将更新为666条。
答案 0 :(得分:0)
创建(charter 1)sample text, sample text.
(charter 2)sample text, sample text.
(charter 3)sample text, sample text.
(公用表表达式),在CTE
之后添加ROW_NUMBER
窗口函数partitioned
,然后编写emp_id
语句加入update
并构建一个case语句来确定行号
下面的代码使用测试数据构建表变量,选择数据以显示"之前"然后使用cte方法修改并选择数据以显示最终结果。
cte
答案 1 :(得分:0)
您可以使用MERGE。
数据准备
create table em1(
emp_id number, emp_dept number, emp_name varchar2(10));
insert into em1 values(123,1,'we');
insert into em1 values(123,1,'asd');
insert into em1 values(123,1,'rfw');
insert into em1 values(345,2,'rtg');
insert into em1 values(345,2,'bfg');
insert into em1 values(345,2,'uyi');
commit;
<强>查询强>
MERGE INTO em1 e
USING (
SELECT emp_id, emp_dept, emp_name,
row_number() over (partition by emp_id order by 1) r
FROM em1
WHERE emp_id in (123,345)
) f
ON (f.emp_id = e.emp_id and f.emp_name = e.emp_name)
WHEN MATCHED THEN
UPDATE SET e.emp_dept = case when f.r = 1 then 555 else 666 end;
<强>结果强>
emp_id emp_dept emp_name
-------------------------
123 555 we
123 666 asd
123 666 rfw
345 555 rtg
345 666 bfg
345 666 uyi