更新MSSQL中两列中具有相同值的行

时间:2017-02-20 10:55:59

标签: sql-server tsql

我的表在两列中具有相同的值。我想只更新一行loginemail中的值相同且data modification更早的行。因此,在下面的示例中,它必须仅使用ID = 2更新一行。我应该使用什么SQL语句?

ID | login   |email                |data modification
---|---------|---------------------|-----------------
1  | abc     |john@mail.com        |   2017-01-10
2  | abc     |john@mail.com        |   2017-02-14
3  | example |john123@hotmail.com  |   2017-02-17

1 个答案:

答案 0 :(得分:4)

一种方法是使用cte获取每个data modificationLogin组合的第一条记录(基于Email):

;WITH CTE AS
(
    SELECT Id, 
           ROW_NUMBER() OVER(PARTITION BY Login, Email ORDER BY [data modification]) as rn
    FROM <Table>
)

UPDATE t
SET <column> = <value>
FROM <Table> t
INNER JOIN CTE ON t.Id = CTE.Id
WHERE rn = 1

如果您使用的是2012或更高版本,则可以使用First_Value编写更短的内容:

;WITH CTE AS
(
    SELECT FIRST_VALUE(Id) OVER(PARTITION BY Login, Email ORDER BY [data modification]) as FirstId
    FROM <Table>
)

UPDATE t
SET <column> = <value>
FROM <Table> t
INNER JOIN CTE ON t.Id = CTE.Id