2009-09-15 5 views
0

J'ai une table qui ressemble à ce qui suit:Syntaxe SQL Server pour sélectionner deux lignes de données et écraser les valeurs qui sont différentes de la première ligne

id, Name,  LinkBackId, Param1, Param2, Param3 
1, "Name1", NULL,  10,  20,  30  
2, "Name2", NULL,  10,  20,  30 
3, "Name3", 2,   14,  NULL, NULL 

Le LinkBackId est important ici parce que cela est associé à la id qui est également dans cette table. En regardant la ligne 3 LinkBackId contient 2 Je veux revenir la ligne de id = 0 et fusionner les valeurs de la ligne 3 dans le résultat comme celui-ci:

3, "Name3", 2, 10, 20, 30 

Je traite les lignes qui contiennent NULL dans la LinkBackId comme une rangée "maître" de paramètres. Les lignes qui contiennent un linkbackid doivent être remplacées par les valeurs principales qui ne sont pas NULL.

Je me demande s'il existe une méthode élégante pour faire cela au lieu d'utiliser beaucoup d'instructions if.

Espérons que cela a du sens.

Merci

+0

Quelle version de SQL Server travaillez-vous? Aussi, à quelle profondeur la recherche récursive doit-elle aller? Que faire si la ligne avec 'id = 2' avait' LinkBackId = 1'? – Welbog

+0

[1] J'utilise SQL Server 2005. [2] La recherche récursive est toujours juste une profondeur. Les valeurs "master" ne doivent pas avoir de linkbackid (donc ils sont NULL ci-dessus). [3] La ligne principale (rangée = 1) gagne. Espérons que cela ait du sens – Belliez

Répondre

3

Voici une requête qui renverra les valeurs d'une rangée, à moins qu'il ait une valeur de LinkBackId, auquel cas il utilisera les valeurs de cette ligne:

SELECT 
    t1.id, 
    t1.Name, 
    t1.LinkBackId, 
    COALESCE(t2.Param1,t1.Param1), 
    COALESCE(t2.Param2,t1.Param2), 
    COALESCE(t2.Param3,t1.Param3) 
FROM table t1 
LEFT OUTER JOIN table t2 
    ON t1.LinkBackId = t2.id 

Il a gagné » t Travailler avec plusieurs niveaux d'imbrication (c'est-à-dire si la ligne 2 renvoyait à la ligne 1). Cela fonctionne en utilisant la fonction COALESCE, qui renvoie le paramètre de la ligne principale s'il n'y a aucune valeur dans la ligne LinkBackId.

+0

Notez que si les valeurs de paramètres de la ligne LinkBack sont NULL, cette requête ne les retournera pas - assurez-vous que c'est le comportement souhaité. – RedFilter

+1

Si les valeurs de retour sont nulles, les valeurs de première ligne seront retournées (si elles ne sont pas nulles), si des valeurs de la ligne linkback sont désirées à chaque fois qu'il existe un ID de liaison, même si les valeurs de liens sont nulles. use Case (cas où t2.Id est nul alors t1.Param1 Else t2.Param1 End) –

+0

C'est parfait, merci. Je dois tester le commentaire NULL ci-dessus. – Belliez

0

Si vous voulez mettre à jour la ligne 2 avec les valeurs de la ligne 3?

si oui, essayez ce

Update tu Set 
    name = o.Name, 
    linkbackId = o.LinkbackId, 
    param1 = o.param1, 
    param2 = o.param3, 
    param3 = o.param3 
From Table tu 
    Join Table tr 
    On tr.LinkbackId = tu.Id 
Where tu.id = 2 

EDIT: Pas ce que vous voulez, désolé

Questions connexes