2013-08-07 8 views
7

Mam tabeli o nazwie „TmpTable”, tabela ta ma Parent Child Relationship, stół zostały dane wyglądać następująco:Przypisywanie samej Sno się dominująca i jej dziecka

Id | Name  | ParentId 
1 PCs   0 
2 MACs  1 
3 Keyboard 0 
4 Mouse  0 
5 Screen  3 
6 Keyboard 4 
7 Mouse  0 
8 Screen  0 
9 Key   0   
10 xyz   9   

Teraz chcę, aby wybrać jedną kolumnę z to, co pokazuje Numer Sekwencji, w tym Rodzicu i Dziecku ma ten sam S.No. i które nie mają żadnych dziecko wzrosły S.No., wynik będzie taki sam, jak poniżej:

Id | Name  | ParentId | SNo 
1 PCs   0   1 
2 MACs  1   1 
3 Keyboard 0   2 
4 Mouse  0   3 
5 Screen  3   2 
6 Keyboard 4   3 
7 Mouse  0   4 
8 Screen  0   5 
9 Key   0   6 
10 xyz   9   6 

Jak mogę zarchiwizować ten wynik proszę kierować/mi pomóc w tej sprawie.

Odpowiedz

6

Można użyć DENSE_RANK() funkcji w połączeniu z ORDER BY CASE:

SELECT *, DENSE_RANK() OVER (ORDER BY CASE WHEN ParentID = 0 THEN ID ELSE ParentID END) 
FROM TmpTable 
ORDER BY Id 

SQLFiddle DEMO

2

można spróbować w ten sposób.

;with cte as 
(Select Row_Number() Over(Order by Id) as Row,Id from Table1 where Parentid=0 
) 
Select A.*,b.row as Sno from Table1 A inner join 
cte as b on b.id=a.parentid or (b.id=a.id and a.parentid=0) order by a.id; 

Sql Fiddle Demo

1

Oto pełnowymiarową rozwiązanie n-Głębokość:

;WITH src AS (
    SELECT id=1, pid=0 
    UNION ALL SELECT id=2, pid=1 
    UNION ALL SELECT id=3, pid=0 
    UNION ALL SELECT id=4, pid=0 
    UNION ALL SELECT id=5, pid=3 
    UNION ALL SELECT id=6, pid=4 
    UNION ALL SELECT id=7, pid=0 
    UNION ALL SELECT id=8, pid=0 
    UNION ALL SELECT id=9, pid=0 
    UNION ALL SELECT id=10, pid=9 
), 
rcte AS (
    SELECT id, pid, sno = ROW_NUMBER() OVER (ORDER BY id) 
    FROM src WHERE pid=0 
    UNION ALL 
    SELECT s.id, s.pid, r.sno 
    FROM 
     rcte r 
     JOIN src s 
      ON s.pid = r.id 
    WHERE s.pid != 0 
) 
SELECT * 
FROM rcte 
ORDER BY id 
0

ten może być również wykonane za pomocą JOIN. Myślałem, że to może być pomocne dla MySQL, ponieważ nie posiadają funkcje okien

SELECT 
    DISTINCT 
    m1.id, 
    m1.name, 
    m1.parentid, 
    1 + count(m2.id) as sno 
FROM 
    mytable m1 
    LEFT JOIN mytable m2 on ((m1.parentid = 0 AND m2.parentid = 0 AND m2.id < m1.id) 
           OR (m2.parentid = 0 AND m2.id < m1.parentid)) 
GROUP BY 
    m1.id, 
    m1.name, 
    m1.parentid 

SQLFIDDLE

Uwaga: Zakłada ona, że ​​twoi rodzice zawsze mają id mniej niż ich childs

Powiązane problemy