comment find le parent de premier niveau pour chaque logging d'enfant

J'utilise SQL Server 2008.

J'ai deux colonnes de données dans une table trans :

 transid ptransid --------------------- 1 1 2 2 3 3 4 1 5 3 6 2 7 2 8 7 9 8 10 4 

Je voudrais montrer le résultat comme

 transid ptransid ---------------------- 1 1 2 2 3 3 4 1 5 3 6 2 7 2 8 2 9 2 10 1 

Question:

 select T0.transid, T3.ptransid from trans T0 left join trans T1 on T0.ptransid = T1.transid left join trans T2 on T1.ptransid = T2.transid left join trans T3 on T2.ptransid = T3.transid 

Mais l'exemple ci-dessus est trop simple. La couche peut avoir 30, comme l'échantillon ci-dessus est seulement 4.

SQL Fiddle

Configuration du schéma MS SQL Server 2008 :

 CREATE TABLE test_table(transid INT, ptransid INT) INSERT INTO test_table VALUES (1 , 1), (2 , 2), (3 , 3), (4 , 1), (5 , 3), (6 , 2), (7 , 2), (8 , 7), (9 , 8), (10 , 4) 

Requête 1 :

 WITH c AS ( SELECT transid, ptransid, ptransid AS topptransid FROM test_table WHERE transid = ptransid UNION ALL SELECT T.transid, T.ptransid, c.topptransid FROM test_table AS T INNER JOIN c ON T.ptransid = c.transid WHERE T.transid <> T.ptransid) SELECT transid, topptransid FROM c ORDER BY transid 

Résultats :

 | transid | topptransid | |---------|-------------| | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 1 | | 5 | 3 | | 6 | 2 | | 7 | 2 | | 8 | 2 | | 9 | 2 | | 10 | 1 |