SQL Server-更新不同的值
我有3列数据: 第1列有重复的值,例如a、b、c Column2具有所有空值 第3列有其他并不重要的数据 我想用一个值eh Hello更新Column2,但只更新column1每个值的一个实例。例如,a=Hello,但Hello的第二个实例为NULL,与bc相同,依此类推 我可以使用以下方法找到不同的值: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
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;