Comment créer une colonne d'identifiant parent / parent pour cette structure de données plate?

J'ai une table comme ça

ID L1 L2 L3 OBId OBDesc ParentId 1 3501-072 3501-072-0102 building1 ? 2 3501-072 3501-072-0102 3501-072-0102-0001 room2 ? 3 3501-072 3501-072-0102 3501-072-0102-0001 3501-072-0102-0001-0001 table1 ? 4 3501-072 3501-072-0102 3501-072-0102-0001 3501-072-0102-0001-0002 chair1 ? 5 3501-072 3501-072-0102 3501-072-0102-0003 room3 ? 6 3501-072 3501-072-0102 3501-072-0102-0003 3501-072-0102-0003-0001 Table2 ? 7 3501-072 3501-072-0102 3501-072-0102-0003 3501-072-0102-0003-0002 chair3 ? 

La structure est fondamentalement, table1 appartient à room2 dans bulding1.

Les colonnes L1, L2, L3 etc. sont les niveaux de hiérarchie qui le représentent.

L'OBId est le numéro unique de chaque nœud de la hiérarchie

J'ai besoin d'une requête qui peut convertir l'ID ParentId avec l'ID pour le prochain nevel up dans le nœud.

Toutes les idées accueillies …

J'ai une table comme ça

 ID L1 L2 L3 OBId OBDesc ParentId 1 3501-072 3501-072-0102 building1 ? 2 3501-072 3501-072-0102 3501-072-0102-0001 room2 ? 3 3501-072 3501-072-0102 3501-072-0102-0001 3501-072-0102-0001-0001 table1 ? 4 3501-072 3501-072-0102 3501-072-0102-0001 3501-072-0102-0001-0002 chair1 ? 5 3501-072 3501-072-0102 3501-072-0102-0003 room3 ? 6 3501-072 3501-072-0102 3501-072-0102-0003 3501-072-0102-0003-0001 Table2 ? 7 3501-072 3501-072-0102 3501-072-0102-0003 3501-072-0102-0003-0002 chair3 ? 

La structure est fondamentalement, table1 appartient à room2 dans bulding1.

Les colonnes L1, L2, L3 etc. sont les niveaux de hiérarchie qui le représentent.

L'OBId est le numéro unique de chaque nœud de la hiérarchie

J'ai besoin d'une requête qui peut remplir le ParentId avec l'ID pour le prochain nevel up dans le noeud.

Toutes les idées accueillies …

—–METTRE À JOUR—–

Afin de simplifier l'exemple, j'ai omis de mentionner qu'il y a un total de 10 niveaux potentiels

S'il y a des valeurs nulles dans L2 et L3 plutôt que des strings vides, vous pouvez utiliser COALESCE

 SELECT COALESCE(L3,L2,L1) as Parent FROM tablename 

sinon vous pouvez utiliser une déclaration de cas

 SELECT CASE WHEN isnull(L2,'') = '' then L1 WHEN isnull(L3,'') = '' then L2 ELSE L3 END as Parent FROM tablename 

EDIT Une mise à jour ressemblerait à quelque chose comme:

 update tablename SET parent = CASE WHEN isnull(L2,'') = '' then L1 WHEN isnull(L3,'') = '' then L2 ELSE L3 END 

En supposant que la structure L1, L2, L3 est fixe (ce qui signifie que la hiérarchie ne dépasse pas 3 niveaux), j'utiliserais l'approche suivante: il suffit d'écrire une requête pour mettre à jour les valeurs pour chaque niveau de la hiérarchie. Cette approche se décompose si la hiérarchie passe à 4 ou 5 niveaux car les requêtes commencent à devenir lourdes, mais cela devrait fonctionner correctement sur 3 niveaux. Si je devais supporter beaucoup plus de niveaux de hiérarchie (ou niveaux variables), je proposerais probablement une solution plus généralisée (qui utiliserait probablement un CURSOR ).

J'ai rassemblé l'exemple suivant qui devrait vous donner les résultats que vous searchz. Cet exemple suppose que L2 et L3 sont vides ('') et non NULL. Une chose que j'ai remarquée en mettant cela set est que datatables que vous avez fournies ne semblent pas être valides (L1 et L2 pour les loggings 2 et 5 sont identiques, ce qui signifie qu'il est possible qu'un logging enfant ait 2 loggings parents), donc je l'ai corrigé dans mon écriture.

 DECLARE @myTable AS TABLE ( ID INT, L1 VARCHAR(50), L2 VARCHAR(50), L3 VARCHAR(50), OBId VARCHAR(50), OBDesc VARCHAR(50), ParentID INT NULL ) INSERT INTO @myTable VALUES(1, '3501-072', '', '', '3501-072-0102', 'building1', NULL) INSERT INTO @myTable VALUES(2, '3501-072', '3501-072-0102', '', '3501-072-0102-0001', 'room2', NULL) INSERT INTO @myTable VALUES(3, '3501-072', '3501-072-0102', '3501-072-0102-0001', '3501-072-0102-0001-0001', 'table1', NULL) INSERT INTO @myTable VALUES(4, '3501-072', '3501-072-0102', '3501-072-0102-0001', '3501-072-0102-0001-0002', 'chair1', NULL) INSERT INTO @myTable VALUES(5, '3501-072', '3501-072-0103', '', '3501-072-0103-0003', 'room3', NULL) INSERT INTO @myTable VALUES(6, '3501-072', '3501-072-0103', '3501-072-0103-0003', '3501-072-0102-0003-0001', 'Table2', NULL) INSERT INTO @myTable VALUES(7, '3501-072', '3501-072-0103', '3501-072-0103-0003', '3501-072-0102-0003-0002', 'chair3', NULL) --Update records with no parent ID UPDATE @myTable SET ParentID = NULL WHERE L2 = '' AND L3 = '' --Update first level UPDATE @myTable SET ParentID = ( SELECT ID FROM @myTable T2 WHERE T2.L1 = T1.L1 AND T2.L2 = '' AND T2.L3 = '' ) FROM @myTable T1 WHERE T1.L2 <> '' AND T1.L3 = '' --Update second level UPDATE @myTable SET ParentID = ( SELECT ID FROM @myTable T2 WHERE T2.L1 = T1.L1 AND T2.L2 = T1.L2 AND T2.L3 = '' AND T1.L2 <> '' ) FROM @myTable T1 WHERE T1.L2 <> '' AND T1.L3 <> '' --Select results SELECT ID, L1, L2, L3, ParentID FROM @myTable 

J'espère que cela pourra aider.