SQL 更新第一个记录实例 - SQL 服务器
SQL Update first instance of record - SQL Server
我有一个导入过程需要更新 table 中旧记录的 "End Date"。导入来自其他人,缺少我需要匹配特定用户信息的一些详细信息。我需要做的是更新旧记录,在下面的示例中,它将是 UserID = 1
,而不是更新 UserID = 4
.
我有以下 sql 要更新,但如您所知,它更新了两条记录:
UPDATE t1
SET t1.[EndDate] = t2.[EndDate]
FROM ExistingUser AS t1, ImportUser AS t2
WHERE (t2.[uName] = t1.[uName]) AND (t1.[EndDate] IS NULL);
免责声明:我没有创建数据库,无法重新设计tables,所以请可怜我。谢谢!!!
现有用户 - Table
UserID uName BeginDate EndDate
1 John 01/01/2013
2 Mary 05/01/2014 04/30/2015
3 Bob 12/01/2014
4 John 06/01/2015
导入用户 - Table
uName EndDate
John 05/31/2015
这可以通过构建一个子查询来完成,该子查询按没有填充 EndDate
的用户名对条目进行编号。这个子查询看起来像这样:
SELECT [UserID], [uName],
ROW_NUMBER() OVER (PARTITION BY [uName] ORDER BY [BeginDate]) AS IX
FROM ExistingUser
WHERE [EndDate] IS NULL
演示:http://www.sqlfiddle.com/#!6/72c49/2
| UserID | uName | IX |
|--------|-------|----|
| 3 | Bob | 1 |
| 1 | John | 1 |
| 4 | John | 2 |
在该子查询中,John
的uName
相同的两条记录按BeginDate
顺序编号。现在,如果我们将原始 UPDATE
查询加入到此子查询中以 IX=1
搜索记录,我们将只更新最早的行。
WITH EarliestExistingUser AS (
SELECT [UserID], [uName],
ROW_NUMBER() OVER (PARTITION BY [uName] ORDER BY [BeginDate]) AS IX
FROM ExistingUser
WHERE [EndDate] IS NULL
)
UPDATE t1
SET t1.[EndDate] = t2.[EndDate]
FROM ExistingUser AS t1
JOIN EarliestExistingUser AS t1f ON t1.UserID = t1f.UserID
,ImportUser AS t2
WHERE (t2.[uName] = t1.[uName]) AND (t1.[EndDate] IS NULL)
AND (t1f.IX = 1)
我有一个导入过程需要更新 table 中旧记录的 "End Date"。导入来自其他人,缺少我需要匹配特定用户信息的一些详细信息。我需要做的是更新旧记录,在下面的示例中,它将是 UserID = 1
,而不是更新 UserID = 4
.
我有以下 sql 要更新,但如您所知,它更新了两条记录:
UPDATE t1
SET t1.[EndDate] = t2.[EndDate]
FROM ExistingUser AS t1, ImportUser AS t2
WHERE (t2.[uName] = t1.[uName]) AND (t1.[EndDate] IS NULL);
免责声明:我没有创建数据库,无法重新设计tables,所以请可怜我。谢谢!!!
现有用户 - Table
UserID uName BeginDate EndDate
1 John 01/01/2013
2 Mary 05/01/2014 04/30/2015
3 Bob 12/01/2014
4 John 06/01/2015
导入用户 - Table
uName EndDate
John 05/31/2015
这可以通过构建一个子查询来完成,该子查询按没有填充 EndDate
的用户名对条目进行编号。这个子查询看起来像这样:
SELECT [UserID], [uName],
ROW_NUMBER() OVER (PARTITION BY [uName] ORDER BY [BeginDate]) AS IX
FROM ExistingUser
WHERE [EndDate] IS NULL
演示:http://www.sqlfiddle.com/#!6/72c49/2
| UserID | uName | IX |
|--------|-------|----|
| 3 | Bob | 1 |
| 1 | John | 1 |
| 4 | John | 2 |
在该子查询中,John
的uName
相同的两条记录按BeginDate
顺序编号。现在,如果我们将原始 UPDATE
查询加入到此子查询中以 IX=1
搜索记录,我们将只更新最早的行。
WITH EarliestExistingUser AS (
SELECT [UserID], [uName],
ROW_NUMBER() OVER (PARTITION BY [uName] ORDER BY [BeginDate]) AS IX
FROM ExistingUser
WHERE [EndDate] IS NULL
)
UPDATE t1
SET t1.[EndDate] = t2.[EndDate]
FROM ExistingUser AS t1
JOIN EarliestExistingUser AS t1f ON t1.UserID = t1f.UserID
,ImportUser AS t2
WHERE (t2.[uName] = t1.[uName]) AND (t1.[EndDate] IS NULL)
AND (t1f.IX = 1)