2010-03-03 47 views
4

我有列的表结构这样的更新如何选择在同一个表作为值的值用于为每一行

  • [ID]
  • [名称]
  • [的ParentId ]
  • [ParentName]

父母都包含在同一个表,我想使用如下语句来填充父名称列:

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

当我这样做时,所有的ParentNames都设置为null。思考?

回答

4

这里还有一个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 
+0

+1非常好的答案 – 2010-03-03 05:22:16

0

这里,子查询返回空值,那么它就是ParentName

1

这里指定空是我的工作

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发布的东西非常相似的东西应该工作,但尝试,因为我可能无法做到这一点。

5

我会与update from语句去。

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

这是特定于T-SQL,但它应该工作得很好。

0
UPDATE 
    T 
SET 
    parentname = PT.name 
FROM 
    MyTable T 
    JOIN 
    MyTable PT ON t.parentid = PT.id 

您发生错误,因为您在子查询中没有关联。你每行

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

不能使用别名像UPDATE TABLE T ...所以推动加入得到零行,除非“ID =的ParentId” /关联到FROM子句(或CTE或派生表)

相关问题