【问题标题】:SQL Server - updating distinct valuesSQL Server - 更新不同的值
【发布时间】:2020-01-01 00:58:44
【问题描述】:

我有 3 列数据:

  • Column1 具有重复值,例如 a a b b c c
  • Column2 具有所有 NULL 值
  • Column3 包含其他不重要的数据

我想用值 eh Hello 更新 Column2,但仅针对 column1 的每个值的 1 个实例。例如,a = Hello 但 Hello 的第二个实例为 NULL,与 b c 相同,依此类推。

我可以使用这个找到不同的值:

select distinct Column1 
from TABLENAME

但是当我尝试更新不同的列时,它会中断。这有什么问题(可能很多!):

update TABLENAME 
set Column2 = 'Hello'
where (select distinct Column1 from TABLENAME)

【问题讨论】:

    标签: sql sql-server distinct


    【解决方案1】:

    您可以尝试使用ROW_NUMBER窗口函数制作行号然后只更新行号为1。

    update t1 
    set Column2 = 'Hello'
    FROM (
        select *,ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column3) rn
        from TABLENAME
    ) t1
    where rn = 1
    

    Results

    | Column1 | Column2 | Column3 |
    |---------|---------|---------|
    |       a |   Hello |       1 |
    |       a |  (null) |       2 |
    |       b |   Hello |       3 |
    |       b |  (null) |       4 |
    |       c |   Hello |       5 |
    |       c |  (null) |       6 |
    

    【讨论】:

      【解决方案2】:

      假设它是您的唯一索引,请使用第 3 列。

      UPDATE tablename SET column2 = 'Hello' WHERE column3 IN
      (SELECT column3 from TableName GROUP BY column1)
      

      【讨论】:

      • 会吗? group by 将在 column1 的每个子集中选择一个 column1 值。因此,它只会更新第 1 列的每个分组中的单行。
      【解决方案3】:

      您也可以只更新第 3 列中具有奇数的行。

      UPDATE tablename SET column2 = 'Hello' WHERE column3 % 2 != 0
      

      【讨论】:

      • 我差点写这个!但是,我认为如果 column1 的每个不同值有两个以上的值,这可能会导致问题
      • 你能创建临时表吗? select column1, max(column3) column3 into #temp1 from yourtable group by column1 update yourtable set column3 = 'Hello' where column3 in (select column3 from #temp1)
      【解决方案4】:

      您也可以使用CROSS APPLYCTE (Common Table Expression) 来实现:

      ;with CTE AS
      (SELECT t.Column1, t.Column2 
      FROM   (SELECT DISTINCT Column1 
              FROM   TABLENAME) x 
             CROSS APPLY(SELECT TOP 1 *
                          FROM   TABLENAME 
                          WHERE  column1 = x.column1) t)
      UPDTATE CTE
      SET Column2 = 'Hello'
      
      SELECT * FROM TABLENAME
      

      【讨论】:

        【解决方案5】:

        你可以使用窗口函数

        UPDATE TT
        SET Col = B
        FROM
        (
          SELECT Col, ROW_NUMBER() OVER(PARTITION BY Col ORDER BY Col) RN
          FROM T
        )TT INNER JOIN
        (
          VALUES (1, 'Hello'), (2, NULL)
        ) TVC (A, B)
        ON TT.RN = TVC.A;
        

        结果:

        +-------+
        |  Col  |
        +-------+
        | Hello |
        | NULL  |
        | Hello |
        | NULL  |
        | Hello |
        | NULL  |
        +-------+
        

        或者使用CASE 表达式为:

        UPDATE TT
        SET Col = CASE WHEN RN = 1 THEN 'Hello' END
        FROM
        (
          SELECT Col, ROW_NUMBER() OVER(PARTITION BY Col ORDER BY Col) RN
          FROM T
        )TT;
        

        Online Demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-29
          • 2021-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多