Sql 基于与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

我目前正在学习如何在SQL Server 2016中使用CTE,因为我有一个很大的表,需要根据助手列的匹配来更新某些列,但我不完全确定这是如何完成的。我知道这也可以通过一个经典的更新来完成,因为我现在想通过CTE的方式来学习和理解它,因为它在不久的将来会派上用场

我有一个助手表:

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