2009-04-07 6 views
7

У меня есть следующие данные:Как я могу обновить таблицу данными, полученными с помощью соединения?

SectorKey Sector foo 
1   A  null 
2   B  null 
...  ... ... 
1   null a 
2   null b 
2   null c 
1   null d 
2   null e 
...  ... ... 

Я хочу обновить Sector колонки, когда он нулевой на основе стоимости sectorKey, то есть я хочу Sector быть «A», когда SectorKey является 1 и «B», когда SectorKey является 2

Я попробовал этот запрос:

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 жалуется на неоднозначное именование, поскольку у меня есть все мои псевдонимы.

Я нашел this thread, и я чувствую, что делаю то же самое, что и в ответном ответе. Я также попытался запрос, предложенный в принятом ответе:

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

, а затем SQLServer жалуется на неправильный синтаксис около «A»

Любые идеи о том, что может происходить, и это исправить? Я использую SQLServer 2008.

EDIT Я не показал общие данные таблицы. У меня не только два случая (A и B), но несколько тысяч случаев. Так явный случай не вариант

ответ

22

Используйте псевдоним в первой части вашего запроса на обновление:

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 

В противном случае он не знает, какой экземпляр таблицы для обновления.

+0

@Joel. Именно то, что мне не хватало. thanks :) – Brann

+0

Кажется, я не могу пройти мимо позиции вашего ОТ, он всегда вызывает там ошибку, есть ли режим mysql, который не принимает FROM после набора? – Gisheri

+1

@ Gisheri Вы используете MySql. Этот вопрос отмечен для Sql Server. Синтаксис для MySql и Sql Server отличается в этой области. MySql не соответствует стандарту ansi. –

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

Должно работать

1

Попробуйте использовать КТР и изменить имя поля для псевдонима:

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 
Смежные вопросы