Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从CTE问题更新_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 从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

我正在从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 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
查询没有CTE
t
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
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
变量/参数提供长度。