Sql 基于与CTE的联接更新列值
我目前正在学习如何在SQL Server 2016中使用CTE,因为我有一个很大的表,需要根据助手列的匹配来更新某些列,但我不完全确定这是如何完成的。我知道这也可以通过一个经典的更新来完成,因为我现在想通过CTE的方式来学习和理解它,因为它在不久的将来会派上用场 我有一个助手表:Sql 基于与CTE的联接更新列值,sql,sql-server,Sql,Sql Server,我目前正在学习如何在SQL Server 2016中使用CTE,因为我有一个很大的表,需要根据助手列的匹配来更新某些列,但我不完全确定这是如何完成的。我知道这也可以通过一个经典的更新来完成,因为我现在想通过CTE的方式来学习和理解它,因为它在不久的将来会派上用场 我有一个助手表: State ABR Alabama AL Alaska AK Arizona AZ 我需要根据State_short和ABR之间的连接来填写State列 User State_sh
State ABR
Alabama AL
Alaska AK
Arizona AZ
我需要根据State_short和ABR之间的连接来填写State列
User State_short State
John AL NULL
Carl AK NULL
Ivan AZ NULL
Martin AZ NULL
William AK NULL
Sean AL NULL
Bob AL NULL
我尝试过以下代码:
WITH StateMatch AS
(
SELECT [State] AS StateName, [ABR] FROM [States]
)
UPDATE [Users]
SET [State] = StateName
FROM StateMatch
但这只给了我这个输出:
User State_short State
John AL Alabama
Carl AK Alabama
Ivan AZ Alabama
Martin AZ Alabama
William AK Alabama
Sean AL Alabama
Bob AL Alabama
我可以看到,我缺少了一个连接,但我不确定如何使用CTE—它是在CTE中完成的,还是在下面的select子句中完成的,还是可以使用where子句完成的?基于另一个帮助表中的联接更新列的最佳和最简单的解决方案是什么?首先:您不需要CTE。您可以只使用相关子查询:
update Users
set State = (
select s.State from States s where s.ABR = Users.State_short
)
where State is null
如果您真的想使用CTE,另一种选择是在CTE中加入
,然后更新CTE。SQLServer具有惊人的功能,可以回溯内容并将更改应用于基础表列:
with cte as (
select u.State, s.State New_state
from Users u
inner join States s on s.ABR = u.State_short
)
update cte set State = New_state
首先:你并不需要一个CTE。您可以只使用相关子查询:
update Users
set State = (
select s.State from States s where s.ABR = Users.State_short
)
where State is null
如果您真的想使用CTE,另一种选择是在CTE中加入
,然后更新CTE。SQLServer具有惊人的功能,可以回溯内容并将更改应用于基础表列:
with cte as (
select u.State, s.State New_state
from Users u
inner join States s on s.ABR = u.State_short
)
update cte set State = New_state
要使查询正常运行,您只需
将用户加入状态匹配中的State\u short
和ABR
值:
WITH StateMatch AS
(
SELECT [State] AS StateName, [ABR] FROM [States]
)
UPDATE [Users]
SET [State] = StateName
FROM [Users] u
JOIN [StateMatch] s ON u.[State_short] = s.[ABR]
然后你可以:
SELECT *
FROM Users
输出
User State_short State
John AL Alabama
Carl AK Alaska
Ivan AZ Arizona
Martin AZ Arizona
William AK Alaska
Sean AL Alabama
Bob AL Alabama
要使查询正常工作,您只需将用户加入StateMatch
中的State\u short
和ABR
值:
WITH StateMatch AS
(
SELECT [State] AS StateName, [ABR] FROM [States]
)
UPDATE [Users]
SET [State] = StateName
FROM [Users] u
JOIN [StateMatch] s ON u.[State_short] = s.[ABR]
然后你可以:
SELECT *
FROM Users
输出
User State_short State
John AL Alabama
Carl AK Alaska
Ivan AZ Arizona
Martin AZ Arizona
William AK Alaska
Sean AL Alabama
Bob AL Alabama