2013-08-07 4 views
7

ich eine Tabelle mit Namen „TmpTable“ haben, haben diese Tabelle die Eltern Kind Beziehung, Tisch haben Daten wie folgt aussehen:zuweisen Same SNo Übergeordnetes und sein Kind

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   

Jetzt möchte ich eine Spalte auswählen Mit Dies zeigt die Sequenznummer, in der Eltern und Kind die gleiche S.No. und welche nicht über jedes Kind hat zugenommen S.No., Ergebnis gleich sein wird wie unten:

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 

Wie kann ich archivieren dieses Ergebnis bitte Führer/hilft mir dabei.

Antwort

6

Sie können DENSE_RANK() Funktion in Kombination mit ORDER BY CASE verwenden:

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

SQLFiddle DEMO

2

Sie können wie folgt versuchen.

;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

Hier ist die ausgewachsene Lösung für n-Tiefe:

;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

Dies auch über ein JOIN getan werden kann. Ich dachte, das für MYSQL hilfreich sein könnte, da es nicht Fensterfunktionen hat

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

Hinweis: Es geht davon aus, dass Ihre Eltern immer eine sind, haben id weniger als ihre childs

Verwandte Themen