Как я могу обновить таблицу с данными, полученными объединением на себе? - PullRequest
8 голосов
/ 07 апреля 2009

У меня есть следующие данные:

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

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

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

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

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

РЕДАКТИРОВАТЬ Я не показал полные данные моей таблицы. У меня не только два случая (A и B), а несколько тысяч случаев. Так что явный случай не вариант

Ответы [ 3 ]

22 голосов
/ 07 апреля 2009

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

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

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

1 голос
/ 07 апреля 2014

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

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  
0 голосов
/ 07 апреля 2009
update
    tbFoo
set
    Sector = (select tf.Sector from tbFoo tf where
                tbFoo.SectorKey = tf.SectorKey and
                tf.Sector is not null)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...