使用值更新列的第一个匹配项,使用其他值更新剩余列

时间:2016-06-17 20:10:10

标签: sql oracle sql-update

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条。

2 个答案:

答案 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
相关问题