2010-03-03 6 views
4

J'ai une structure de table avec des colonnes comme celui-ciComment sélectionner une valeur dans la même table que la valeur d'une mise à jour pour chaque ligne

  • [ID]
  • [Nom]
  • [ParentId ]
  • [NomParent]

les parents sont contenus dans la même table, et je voudrais remplir la colonne de nom de parent à l'aide d'une déclaration comme:

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

Lorsque je fais cela, tous les ParentNames sont définis sur null. Pensées?

Répondre

4

Voici une autre syntaxe T-SQL, vous pouvez utiliser:

(BTW, je suis d'accord avec Cletus au sujet des préoccupations de dénormalisation.)

-- 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 très belle réponse –

0

Ici, sous requête qui renvoie des valeurs nulles, de sorte qu'il est assignant NULL à NomParent

1

Voici une solution que je travaille

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

Remarque Je refuse de croire que ça doit être si moche, je suis sûr que quelque chose de très similaire à ce que OMG Ponies a posté devrait marcher mais essayer comme je pourrais le faire.

5

Je voudrais aller avec la déclaration update from.

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

Ceci est spécifique à T-SQL, mais cela devrait plutôt bien fonctionner.

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

Vous erreur se produit parce que vous n'avez aucune corrélation dans la sous-requête. Vous obtenez zéro lignes à moins que « Id = ParentId » dans chaque ligne

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

Vous ne pouvez pas utiliser un alias comme UPDATE TABLE T ... si pousser la jointure/corrélation dans la clause FROM (ou d'un CTE ou d'une table dérivée)

Questions connexes