2012-01-03 16 views
5

Tôi có một bảng tự tham khảo với nội dung như thế này:tự bảng tham chiếu với bảng con

Self-referencing parent table 
ID ParentID Name 
--------------------- 
1    John 
2 1   Mike 
3 2   Erin 
4 1   Janie 
5    Eric 
6 5   Peter 

Các hệ thống phân cấp cây sẽ trông như thế này

  • John
    • Mike
      • Erin
    • Janie
  • Eric
    • Peter

Và một bảng con mà các cửa hàng lá của bảng cha trông như thế này:

ID Sales 
3 100 
3 100 
4 200 
4 200 
6 300 
6 300 
6 300 

Tôi cố gắng để cuộn lên tổng số từ nút lá lên đến hệ thống phân cấp để nó sẽ trở lại như. .

ID Name Sum 
1 John 800 
2 Mike 200 
3 Erin 200 
4 Janie 400 
5 Eric 900 
6 Peter 900 

Bất kỳ ý tưởng nào đạt được điều này trong sql 2008? Cảm ơn trước.

Trả lời

5

EDIT Tất cả tập hợp di chuyển ra khỏi CTE

WITH 
    tree AS 
(
    SELECT 
    id    AS root_id, 
    name    AS root_name, 
    id    AS leaf_id 
    FROM 
    yourTreeTable 

    UNION ALL 

    SELECT 
    tree.root_id  AS root_id, 
    tree.name   AS root_name, 
    yourTreeTable.id AS leaf_id 
    FROM 
    tree 
    INNER JOIN 
    yourTreeTable 
     ON tree.leaf_id = yourTreeTable.ParentID 
) 
SELECT 
    tree.root_id, 
    tree.root_name, 
    COALESCE(SUM(yourScoresTable.score), 0) AS total 
FROM 
    tree 
LEFT JOIN 
    yourScoresTable 
    ON yourScoresTable.ID = tree.leafID 
GROUP BY 
    tree.root_id, 
    tree.root_name 
+0

Cảm ơn bạn đã trả lời, Dem. Tôi nhận được hai thông báo lỗi với truy vấn đó: 'GROUP BY, HAVING hoặc các hàm tổng hợp không được phép trong phần đệ quy của biểu thức bảng đệ quy chung 'flattend'.' và' Nối ngoài không được phép trong phần đệ quy của một biểu thức bảng thông dụng đệ quy 'flattend'. '. Bất kỳ ý tưởng? – Eric

+0

@Eric - Tôi quá tập luyện, tôi thậm chí còn không nhớ là đã xảy ra vụ án. Tôi đã mã hóa lại sao cho tất cả tập hợp được thực hiện bên ngoài CTE. – MatBailie

+0

xin lỗi vì trả lời muộn, tôi phải đi sớm hôm qua và tôi đã tham dự một cuộc họp cả buổi sáng. Truy vấn hoạt động như sự quyến rũ. Nhưng tôi đã gặp khó khăn khi hiểu CTE và cách hàm COALESCE hoạt động. Tôi cần phải thêm cột ParentID vào kết quả để tôi có thể xây dựng lại cấu trúc cây trong ứng dụng nhưng tôi tiếp tục nhận được số lượng khác nhau. Bạn có thể giúp thêm một chút không? Cảm ơn một lần nữa. – Eric

1

Ở đây là:

Hãy giả sử schema này:

​create table #parent (
ID int, 
ParentID int, 
Name varchar(50)); 

create table #child (
ID int, 
Sales int); 

Truy vấn là tự giải thích:

WITH 
    tree AS 
(
    SELECT 
    id as id_parent, 
    id as id 
    FROM 
    #parent 
    UNION ALL 
    SELECT 
    tree.id_parent as id_parent, 
    #parent.id AS id 
    FROM 
    tree 
    INNER JOIN 
    #parent  
     ON tree.id = #parent.ParentID 
) 
SELECT 
    #parent.id, 
    #parent.name, 
    COALESCE(SUM(#child.Sales), 0) AS total 
FROM 
    #parent 
LEFT JOIN 
    tree 
    ON #parent.ID = tree.id_parent 
LEFT JOIN 
    #child on tree.id = #child.id 
GROUP BY 
    #parent.id, 
    #parent.name 

CTE trả về một danh sách 'lá' cho mỗi nhân viên (#parent), sau đó truy vấn tổng tất cả doanh thu cho 'chiếc lá' này. You can test it running.

EDITED

Query là cố định.

+0

cảm ơn câu trả lời.Tôi đã thử chạy truy vấn nhưng tôi nhận thấy tổng của nút gốc không chính xác. Số tiền cho John phải là 800 thay vì 400. – Eric

+0

@Eric, Cố định. Nhưng hãy cẩn thận, tổng của John là 600 không 800 (jhon = 0, Mike = 0, Erin = 100 + 100, Janie = 200 + 200) – danihp

+0

xấu của tôi. cảm ơn vì đã sửa nó. Tôi đã dành quá nhiều giờ về vấn đề này và cuối cùng tôi đã có những gì tôi cần. cảm ơn một lần nữa. – Eric