Sql 使用CTE更新无法识别set子句中的列名

Sql 使用CTE更新无法识别set子句中的列名,sql,sql-server,sql-update,common-table-expression,Sql,Sql Server,Sql Update,Common Table Expression,我需要用另一个表中的数据更新现有表。我的CTE给了我正确的结果,但当我试图用CTE更新时,SSMS在 Msg 102, Level 15, State 1, Line 13 Incorrect syntax near '.'. 或以下行中的列名无效: set cm.Action.Identifier_fk = ID set cm.ActionRequestedAction = Action set cm.Action.apartment_fk = apartment_fk 代码如下: Us

我需要用另一个表中的数据更新现有表。我的CTE给了我正确的结果,但当我试图用CTE更新时,SSMS在

Msg 102, Level 15, State 1, Line 13
Incorrect syntax near '.'. 
或以下行中的列名无效:

set cm.Action.Identifier_fk = ID
set cm.ActionRequestedAction = Action
set cm.Action.apartment_fk = apartment_fk
代码如下:

Use DB;
GO

with CTE (ID,Action,Identifier_fk,apartment_fk) AS 

(select a.ID, a.Action, b.Identifier_fk, m.apartment_fk 
from Project.AllSent a (nolock) 
    left outer join cm.Action b (nolock) on a.ID=b.Identifier_fk
    left Outer Join csv.Matching m (nolock) on m.Identifier_fk = a.ID
    left outer join csv.Apartment p (nolock) on m.apartment_fk=p.apartment_pk
    where b.Identifier_fk is NULL) 

update cm.Action 
set cm.Action.Identifier_fk = ID
set cm.Action.RequestedAction = Action
set cm.Action.apartment_fk = apartment_fk

    from CTE c
    JOIN Project.AllSent t (nolock) on t.ID=c.ID;

正确的
update
语句只有一个
set
。此外,在
from
子句中没有
cm
。我打算提议废除CTE:

update b
    set Identifier_fk = a.ID,
        Action.RequestedAction = a.Action,
        apartment_fk = mm.apartment_fk
    from Project.AllSent a (nolock) left join
         cm.Action b (nolock)
         on a.ID = b.Identifier_fk left join
         csv.Matching m (nolock)
         on m.Identifier_fk = a.ID left join
         csv.Apartment p (nolock)
         on m.apartment_fk = p.apartment_pk
    where b.Identifier_fk is NULL;

我认为最后的
join
是不必要的。

正确的
update
语句只有一个
set
。此外,在
from
子句中没有
cm
。我打算提议废除CTE:

update b
    set Identifier_fk = a.ID,
        Action.RequestedAction = a.Action,
        apartment_fk = mm.apartment_fk
    from Project.AllSent a (nolock) left join
         cm.Action b (nolock)
         on a.ID = b.Identifier_fk left join
         csv.Matching m (nolock)
         on m.Identifier_fk = a.ID left join
         csv.Apartment p (nolock)
         on m.apartment_fk = p.apartment_pk
    where b.Identifier_fk is NULL;


我认为最后的
join
是不必要的。

update
查询中
cm.Action
是什么?cm-是一个模式,Action-是一个表。我已经有一段时间没有使用SQL Server了,但是你能在一个更新中有多个
SET
调用吗?你不是用逗号把它们分开吗?我想你是对的,每次执行只处理一个。我已经尝试过一次执行一个,但我仍然在提示相同的问题。不,更新多列的语法是
set col1=1,col2=2,col3=3
什么是
cm。在
update
query中,Action
是一个模式,Action是一个表。我使用SQL Server已经有一段时间了,但是你能在一次更新中设置多个
调用吗?你不是用逗号把它们分开吗?我想你是对的,每次执行只处理一个。我已经尝试过一次执行一个列,但我仍然在提示相同的问题。不,更新多个列的语法是
set col1=1,col2=2,col3=3
,我也这么认为,我没有必要。我确实在连接中的From子句中看到了[cm]。你到底指的是什么?不是苏为什么,但这会更新0行。。。有什么想法吗?(0行受影响)我看不到
cm
。所有别名都应该引用from
子句中的表。@enigma6205。您正在使用
left join
查询要更新的表。这真的没有道理。
b
应该是
from
子句中的第一个表,或者第一个联接应该是
内部联接。我也这样认为,我没有必要。我确实在联接中的from子句中看到了[cm]。你到底指的是什么?不是苏为什么,但这会更新0行。。。有什么想法吗?(0行受影响)我看不到
cm
。所有别名都应该引用from
子句中的表。@enigma6205。您正在使用
left join
查询要更新的表。这真的没有道理。
b
应该是
from
子句中的第一个表,或者第一个联接应该是
内部联接。