Как выбрать значение в той же таблице, что и значение для обновления для каждой строки - PullRequest
4 голосов
/ 03 марта 2010

У меня есть структура таблицы с такими столбцами

  • [ID]
  • [Имя]
  • [ParentId]
  • [ParentName]

Родители содержатся в одной таблице, и я хотел бы заполнить столбец имени родителя с помощью следующего выражения:

UPDATE Table
   SET ParentName = (select Name  
                      from Table 
                     where Id = ParentId)

Когда я делаю это, все ParentNames устанавливаются в нуль. Мысли?

Ответы [ 5 ]

5 голосов
/ 03 марта 2010

Я бы пошел с оператором update from.

UPDATE tb
SET
    tb.ParentName = parent.Name
FROM Table tb
INNER JOIN Table parent ON parent.Id = tb.ParentId

Это специфично для T-SQL, но должно работать очень хорошо.

4 голосов
/ 03 марта 2010

Вот еще один синтаксис T-SQL, который вы можете использовать:

(Кстати, я согласен с Клитом о проблемах денормализации.)

-- create dummy table
create table test (id int, name varchar(20), 
parentid int, parentname varchar(20))

go

-- add some rows 
insert test values (1, 'parent A', null, null)
insert test values (2, 'parent B', null, null)
insert test values (3, 'parent C', null, null)

insert test values (11, 'child A 1', 1, null)
insert test values (12, 'child A 2', 1, null)
insert test values (33, 'child C 1', 3, null)

go

-- perform update
update c set parentname = p.name from test c join test p on c.parentid = p.id 

go

-- check result
select * from test
1 голос
/ 03 марта 2010

Вот решение, которое у меня работает

UPDATE TABLE
SET ParentName = b.Name from
(
    select t.name as name, t.id as id
    from TABLE t  
) b
where b.id = parentid

Примечание Я отказываюсь верить, что это должно быть так уродливо, я уверен, что что-то очень похожее на то, что опубликовано в OMG Ponies, должно сработать, но, как я мог, я не смог этого сделать.

0 голосов
/ 03 марта 2010
UPDATE
    T
SET
    parentname = PT.name
FROM
    MyTable T
    JOIN
    MyTable PT ON t.parentid = PT.id

Ваша ошибка возникает из-за отсутствия корреляции в подзапросе. Вы получаете ноль строк, если только «Id = ParentId» в каждой строке

select Name from Table where Id = ParentId -- = no rows

Нельзя использовать псевдоним, например UPDATE TABLE T ..., поэтому вставьте соединение / корреляцию в предложение FROM (или CTE или производную таблицу)

0 голосов
/ 03 марта 2010

Здесь подзапрос, возвращающий нулевые значения, так что он присваивает нулевое значение ParentName

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