2013-08-07 26 views
7

我有一個表名「TmpTable」,此表有父子關係,表有數據看起來像:指定同斯諾向母公司及其子

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   

現在我想選擇一個柱這顯示序列號,在那個父母和孩子有相同的S.No.並沒有任何孩子都增加S.No.,結果將是相同的,如下:

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 

如何歸檔這個結果請指導/幫我在這。

回答

6

您可以使用組合DENSE_RANK()功能與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

你可以嘗試這樣的。

;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

下面是正深入全面的解決方案:

;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

這也可以通過JOIN來完成。我想這可能對MySQL是有幫助的,因爲它沒有窗函數

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

注:它假定你的父母總是比他們的childs

一個 id