2013-08-07 43 views
7

Tôi có một bảng với tên "TmpTable", bảng này có các phụ huynh trẻ em Quan hệ, bảng có dữ liệu như sau:Gán Cùng SNO để cha mẹ và con của nó

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   

Bây giờ tôi muốn chọn một cột mở Điều này cho thấy số thứ tự, trong đó phụ huynh và trẻ em có cùng một S.No. và không có bất kỳ đứa trẻ nào đã tăng S.No., kết quả sẽ giống như sau:

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 

Làm cách nào để lưu trữ kết quả này, xin vui lòng Hướng dẫn/giúp tôi về điều này.

Trả lời

6

Bạn có thể sử dụng chức năng DENSE_RANK() kết hợp với 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

Bạn có thể thử như thế này.

;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

Đây là giải pháp toàn diện cho n-chiều sâu:

;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

này cũng có thể được thực hiện thông qua một JOIN. Tôi nghĩ điều này có thể hữu ích cho MYSQL vì nó không có chức năng cửa sổ

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

Lưu ý: Nó giả định rằng cha mẹ của bạn luôn có một id ít hơn họ childs

Các vấn đề liên quan