Sql 如何使用联接本身检索的数据更新表?

Sql 如何使用联接本身检索的数据更新表?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有以下数据: SectorKey Sector foo 1 A null 2 B null ... ... ... 1 null a 2 null b 2 null c 1 null d 2 null e ... ... ... 我希望在列扇区为null时根据sectorKey的值更新它,

我有以下数据:

SectorKey Sector foo  
1         A      null 
2         B      null
...       ...    ...
1         null   a  
2         null   b 
2         null   c 
1         null   d 
2         null   e 
...       ...    ...
我希望在列扇区为null时根据sectorKey的值更新它,即当sectorKey为1时,我希望扇区为“A”,当sectorKey为2时,扇区为“B”

我尝试了以下查询:

update tbFoo
set Sector=A.sector 
from tbFoo A INNER JOIN tbFoo B
ON A.SectorKey=B.SectorKey 
and A.Sector is not null 
and B.Sector is null
并收到以下错误消息:

表“tbFoo”不明确

我试图给第一个tbFoo加上别名,但它似乎不是一个有效的语法。我不明白为什么SQLServer抱怨命名不明确,因为我所有的表都有别名

我发现了,我觉得我在做的事情和投票结果完全一样。我还尝试了接受答案中建议的问题:

    update tbFoo A
    set Sector = 
       (select Sector from tbFoo 
        where A.SectorKey=SectorKey and Sector is not null)
然后SQLServer抱怨“A”附近的语法不正确

对可能发生的事情有什么想法,以及如何解决这个问题?我正在使用SQLServer2008

编辑我尚未显示表格的总数据。我不是只有两个病例(A和B),而是几千个病例。因此,明确的案例不是一种选择

update
    tbFoo
set
    Sector = (select tf.Sector from tbFoo tf where
                tbFoo.SectorKey = tf.SectorKey and
                tf.Sector is not null)

应该可以工作

在更新查询的第一部分使用别名:

update B
set Sector=A.sector 
from tbFoo A INNER JOIN tbFoo B
ON A.SectorKey=B.SectorKey 
and A.Sector is not null 
and B.Sector is null

否则它不知道要更新表的哪个实例。

尝试使用CTE并更改alias的字段名称:

WITH CTE_TBFOO(SETOR)
AS
(  
    SELECT Sector
    FROM tbFoo T1  
)
update tbFoo
set Sector= A.SETOR
from CTE_TBFOO A 
WHERE A.SETOR = SectorKey 
and   A.SETOR  is not null 
and   B.Sector is null  

我似乎无法越过FROM的位置,它总是在那里抛出一个错误,是否有一个mysql模式在设置之后不接受FROM?@Gisheri您正在使用mysql。此问题已标记为Sql Server。MySql和Sql Server的语法在这方面是不同的。MySql在这里不遵循ansi标准。