Sql 从CTE问题更新
我正在从cte更新,但出现了此常见错误Sql 从CTE问题更新,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在从cte更新,但出现了此常见错误 无法绑定多部分标识符“t.newfips”。我知道在其他情况下如何处理此错误,但在这种情况下我不知道如何处理 我的问题 with t as ( select * from FIPSModificationsBEA t1 inner join [BEAtoFIPS] t2 on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS) ) update [BEAtoFIPS] set s
无法绑定多部分标识符“t.newfips”。
我知道在其他情况下如何处理此错误,但在这种情况下我不知道如何处理
我的问题
with t as (
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
update [BEAtoFIPS]
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
where concat(t2.statefips, t2.countyfips) = t.newfips
go
我通过以下查询检查了查询
with t as (
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
select newfips from t
go
这个查询有效。因此,我感到困惑。为什么后者有效,而前者无效?它们在结构上不是基本相同吗?前者有什么问题?您只需更新cte即可:
with t as (
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
update t
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
go
否则加入到cte
with t as (
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
update t2
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
inner join t
on concat(t2.statefips, t2.countyfips) = t.newfips
go
您只需更新cte即可:
with t as (
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
update t
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
go
否则加入到cte
with t as (
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
update t2
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
inner join t
on concat(t2.statefips, t2.countyfips) = t.newfips
go
您的
UPDATE
查询没有CTEt
的FROM
条目(但是您的选择
,这就是它工作的原因)
考虑CTE的一种方法类似于只对一个查询可见的临时视图。所以你所拥有的(有点)是这样的:
Create View t (...)
as
(
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
go
update [BEAtoFIPS]
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
where concat(t2.statefips, t2.countyfips) = t.newfips
go
在本例中可能更明显的是,t
实际上没有在UPDATE
查询中的任何地方定义
要修复它,您需要将连接到视图,告诉它如何连接到查询:
update [BEAtoFIPS]
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
join t
on concat(t2.statefips, t2.countyfips) = t.newfips
go
带有CTE的查询需要看起来完全相同-
连接到CTE,并指定它与查询其余部分的关系。您的更新查询没有CTEt
的FROM
条目(但您的选择条目,这就是它工作的原因)
考虑CTE的一种方法类似于只对一个查询可见的临时视图。所以你所拥有的(有点)是这样的:
Create View t (...)
as
(
select * from FIPSModificationsBEA t1
inner join [BEAtoFIPS] t2
on cast(t1.newfips as varchar) = concat(t2.statefips,t2.CountyFIPS)
)
go
update [BEAtoFIPS]
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
where concat(t2.statefips, t2.countyfips) = t.newfips
go
在本例中可能更明显的是,t
实际上没有在UPDATE
查询中的任何地方定义
要修复它,您需要将
连接到视图,告诉它如何连接到查询:
update [BEAtoFIPS]
set statefips = left(t.oldfips, 2) , countyfips = right(t.oldfips, 3)
from [BEAtoFIPS] t2
join t
on concat(t2.statefips, t2.countyfips) = t.newfips
go
带有CTE的查询需要看起来完全相同-加入CTE,并指定它与查询其余部分的关系。您在更新查询中没有加入CTE,因此未分配t
试试这个:
WITH tempData AS (
SELECT * FROM FIPSModificationsBEA t1
INNER JOIN [BEAtoFIPS] t2
ON CAST(t1.newfips as varchar) = CONCAT(t2.statefips,t2.CountyFIPS)
)
UPDATE t2
SET statefips = LEFT(t.oldfips, 2),
countyfips = right(t.oldfips, 3)
FROM [BEAtoFIPS] AS t2
INNER JOIN tempData AS t
ON t.newFips = concat(t2.statefips, t2.countyfips)
但是,您完全可以在没有cte的情况下执行此操作:
UPDATE b
SET statefips = LEFT(m.oldfips, 2),
countyfips = RIGHT(m.oldfips, 3)
FROM [BEAtoFIPS] AS b
INNER JOIN FIPSModificationsBEA AS m
ON CAST(m.newfips as varchar) = CONCAT(b.statefips,b.CountyFIPS)
您尚未在更新查询中加入CTE,因此未分配t
试试这个:
WITH tempData AS (
SELECT * FROM FIPSModificationsBEA t1
INNER JOIN [BEAtoFIPS] t2
ON CAST(t1.newfips as varchar) = CONCAT(t2.statefips,t2.CountyFIPS)
)
UPDATE t2
SET statefips = LEFT(t.oldfips, 2),
countyfips = right(t.oldfips, 3)
FROM [BEAtoFIPS] AS t2
INNER JOIN tempData AS t
ON t.newFips = concat(t2.statefips, t2.countyfips)
但是,您完全可以在没有cte的情况下执行此操作:
UPDATE b
SET statefips = LEFT(m.oldfips, 2),
countyfips = RIGHT(m.oldfips, 3)
FROM [BEAtoFIPS] AS b
INNER JOIN FIPSModificationsBEA AS m
ON CAST(m.newfips as varchar) = CONCAT(b.statefips,b.CountyFIPS)
-您应该始终为所有varchar
或nvarchar
变量/参数提供长度。-您应该始终为所有varchar
或nvarchar
变量/参数提供长度。