2009-02-19 59 views
9

Hình ảnh bạn đang tạo lược đồ DB cho bảng thảo luận có chuỗi. Có cách nào hiệu quả để chọn danh sách được sắp xếp đúng cho một chuỗi nhất định không? Mã tôi đã viết nhưng không phân loại theo cách tôi muốn.Sắp xếp thứ tự SQL CTE và Thứ tự sắp xếp tùy chỉnh

Hãy nói rằng bạn có dữ liệu này:

ID | ParentID 
----------------- 
1 | null 
2 | 1 
3 | 2 
4 | 1 
5 | 3

Vì vậy, cấu trúc có nghĩa vụ phải trông như thế này:

1 
|- 2 
| |- 3 
| | |- 5 
|- 4

Lý tưởng nhất, trong các mã, chúng tôi muốn tập hợp kết quả xuất hiện trong theo thứ tự sau: 1, 2, 3, 5, 4
VẤN ĐỀ: Với CTE tôi đã viết nó thực sự được trả lại là: 1, 2, 4, 3, 5

Tôi biết điều này sẽ dễ dàng nhóm/đặt hàng bằng cách sử dụng LINQ nhưng tôi không muốn làm điều này trong bộ nhớ. Nó có vẻ như giải pháp tốt nhất vào thời điểm này mặc dù ...

Dưới đây là CTE Tôi hiện đang sử dụng:

with Replies as ( 
    select c.CommentID, c.ParentCommentID 1 as Level 
     from Comment c 
     where ParentCommentID is null and CommentID = @ParentCommentID 

    union all 

    select c.CommentID, c.ParentCommentID, r.Level + 1 as Level 
     from Comment c 
     inner join Replies r on c.ParentCommentID = r.CommentID 
) 

select * from Replies 

Bất kỳ trợ giúp sẽ được đánh giá cao; Cảm ơn!



Tôi mới sử dụng SQL và chưa từng nghe về kiểu dữ liệu phân cấp trước đó. Sau khi đọc về nó từ this comment Tôi quyết định tôi có thể muốn kết hợp điều này vào thiết kế của tôi. Tôi sẽ thử nghiệm với điều này tối nay và đăng thêm thông tin nếu tôi có thành công.


Cập nhật
Returned kết quả từ dữ liệu mẫu của tôi, sử dụng gợi ý dance2die của:

ID | ParentID | Level | DenseRank 
------------------------------------- 
15  NULL   1   1 
20  15   2   1 
21  20   3   1 
17  22   3   1 
22  15   2   2 
31  15   2   3 
32  15   2   4 
33  15   2   5 
34  15   2   6 
35  15   2   7 
36  15   2   8
+0

các vị thần sql trở nên phẫn nộ từ yêu cầu của bạn – Shawn

Trả lời

0

Hmmmm - Tôi không chắc chắn nếu cấu trúc của bạn là phù hợp nhất cho vấn đề này. Trên đỉnh đầu của tôi, tôi không thể nghĩ đến việc sắp xếp dữ liệu như bạn muốn trong truy vấn trên.

Điều tốt nhất tôi có thể nghĩ là nếu bạn có bảng cha kết hợp các nhận xét của bạn với nhau (ví dụ: bảng chủ đề). Nếu bạn làm bạn có thể chỉ cần tham gia trả lời của bạn vào đó (bạn sẽ cần phải bao gồm cột chính xác rõ ràng), và sau đó bạn có thể sắp xếp theo topicID, Cấp để có thứ tự sắp xếp bạn đang theo sau (hoặc bất kỳ thông tin nào khác bảng chủ đề đại diện cho một giá trị tốt cho việc sắp xếp).

0

Cân nhắc việc lưu trữ toàn bộ hệ thống phân cấp (với trình kích hoạt để cập nhật nó nếu nó thay đổi) trong một trường.

lĩnh vực trong ví dụ của bạn này sẽ có: 1,2 1.2.3 1.2.5 1,4

sau đó bạn chỉ cần phải sắp xếp trên sân đó, hãy thử này và xem:

create table #temp (test varchar (10)) 
insert into #temp (test) 
select '1' 
union select '1.2' 
union select '1.2.3' 
union select '1.2.5' 
union select '1.4' 
select * from #temp order by test asc 
+0

có - đây được gọi là đường dẫn vật chất –

8

Tôi chắc chắn rằng bạn sẽ yêu thích điều này. Gần đây tôi đã tìm hiểu về chức năng Dense_Rank(), cho "xếp hạng trong phân vùng của tập hợp kết quả" theo MSDN

Kiểm tra mã bên dưới và cách "CommentID" được sắp xếp.

Theo như tôi hiểu, bạn đang cố gắng phân vùng tập hợp kết quả của bạn theo ID phụ huynh.

Chú ý đến cột "denserank".

with Replies (CommentID, ParentCommentID, Level) as 
(
     select c.CommentID, c.ParentCommentID, 1 as Level 
     from Comment c 
     where ParentCommentID is null and CommentID = 1 

     union all 

     select c.CommentID, c.ParentCommentID, r.Level + 1 as Level 
     from Comment c 
       inner join Replies r on c.ParentCommentID = r.CommentID 
) 
select *, 
     denserank = dense_rank() over (partition by ParentCommentID order by CommentID) 
from Replies 
order by denserank 

alt text

Kết quả dưới đây

+0

Cảm ơn bạn đã gợi ý, tôi đã cố gắng làm việc dense_rank() trước tiên không có may mắn. Tôi truy vấn mã của bạn trên dữ liệu mẫu của tôi và nó đã hoạt động ... gần như. Một hàng đã hết hàng. Tôi sẽ đăng dữ liệu ở trên. –

1

Bạn phải sử dụng HierarchyId (SQL2008 chỉ) hoặc một loạt các chuỗi (hoặc byte) nối.

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