Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-更新不同的值_Sql_Sql Server_Distinct - Fatal编程技术网

SQL Server-更新不同的值

SQL Server-更新不同的值,sql,sql-server,distinct,Sql,Sql Server,Distinct,我有3列数据: 第1列有重复的值,例如a、b、c Column2具有所有空值 第3列有其他并不重要的数据 我想用一个值eh Hello更新Column2,但只更新column1每个值的一个实例。例如,a=Hello,但Hello的第二个实例为NULL,与bc相同,依此类推 我可以使用以下方法找到不同的值: select distinct Column1 from TABLENAME 但当我尝试更新其他列时,它会中断。出了什么问题可能很多!!为此: update TABLENAME set

我有3列数据:

第1列有重复的值,例如a、b、c Column2具有所有空值 第3列有其他并不重要的数据 我想用一个值eh Hello更新Column2,但只更新column1每个值的一个实例。例如,a=Hello,但Hello的第二个实例为NULL,与bc相同,依此类推

我可以使用以下方法找到不同的值:

select distinct Column1 
from TABLENAME
但当我尝试更新其他列时,它会中断。出了什么问题可能很多!!为此:

update TABLENAME 
set Column2 = 'Hello'
where (select distinct Column1 from TABLENAME)
您可以尝试使用ROW_NUMBER窗口函数生成ROW NUMBER,然后仅使用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
:


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

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

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

UPDATE tablename SET column2 = 'Hello' WHERE column3 % 2 != 0
您还可以使用交叉应用和CTE公共表表达式来实现这一点:

;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

您可以使用窗口函数作为

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;
结果:

或使用大小写表达式作为:

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;

会吗?group by将在column1的每个子集内选择column1值。因此,它将只更新列1中每个分组中的一行!但是,如果Column1的每个不同值都有两个以上的值,我认为这可能会导致问题。您是否能够创建临时表?从表格组中选择column1,maxcolumn3 column3到temp1,按column1更新表格集column3='Hello',其中从temp1选择column3中的column3
+-------+
|  Col  |
+-------+
| Hello |
| NULL  |
| Hello |
| NULL  |
| Hello |
| NULL  |
+-------+
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;