【问题标题】:Updating the first occurrence of the column with a value and the remaining with other value用一个值更新第一次出现的列,用其他值更新剩余的列
【发布时间】:2016-06-17 20:10:10
【问题描述】:
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。

【问题讨论】:

  • 您可以重新格式化并显示您尝试过的内容吗?
  • 哪个数据库? sql 服务器?
  • emp_name 还是 emp_ssn?
  • 我写的方向对你有用吗?我知道 oracle 有 cte 和 window 函数,但我并不总是了解什么是 sql-server 特定语法而不是 ANSI,所以我使我的代码非常标准。无论如何,我很有信心该方法应该适合你。让我知道。
  • 选择部分有效,但我无法更新它。它显示“缺少选择语句错误”

标签: sql oracle sql-update


【解决方案1】:

创建一个CTE(公用表表达式)通过emp_id添加一个ROW_NUMBER窗口函数partitioned,然后编写一个update语句加入cte并构建一个case语句来确定行号

下面的代码使用测试数据构建一个表变量,选择数据显示“之前”,然后使用 cte 方法修改并选择数据显示最终结果。

 ;WITH cte AS (
    SELECT 
       emp_id
       ,ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY emp_SSN) AS RowNum
    FROM
       @Table
)

UPDATE t
    SET emp_dept = CASE WHEN RowNum = 1 THEN 555 ELSE 666 END
FROM
    @Table t
    INNER JOIN cte u
    ON t.emp_id = u.emp_id        

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多