1

我有一個問題,我試圖解決,我認爲不同於我在此處研究過的其他SQL鄰接列表層次結構問題。我試圖對數據進行分類,以便所有的孩子都在他們的父母面前被列出。我已經有CTE返回給定ParentID的所有孩子和給定ChildID的所有父母,但那些不符合我目前的需要。SQL 2012 - 公共表表達式 - 層次結構 - 列出所有孩子在父母面前

我有兩個表:ItemMaster.ItemID之間存在References.ParentID

CREATE TABLE [dbo].[ItemMaster](
[ItemID] [int] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](50) NOT NULL, 

CREATE TABLE [dbo].[References](
[RefID] [int] IDENTITY(1,1) NOT NULL, 
[ParentID] [int] NOT NULL, 
[ChildID] [int] NOT NULL, 

外鍵關係和References.ChildID

這裏從我的表是一些示例數據...

ItemID,Name

  • 1,A1
  • 2,A2
  • 3,A3
  • 4,P1
  • 5,P2
  • 6,P3
  • 7,P4
  • 8,TOP

REFID,PARENTID ,ChildID

  • 1,1,5
  • 2,2,5-
  • 3,2,6
  • 4,3,2
  • 5,7,3
  • 6,8,4
  • 7,8,1
  • 8,8,2
  • 9,8,3
  • 10,8,7

我想會列出每個項目的輸出在任何父母面前列出的孩子的ID和姓名。像這樣...

的ItemID,名稱

  • 4,P1
  • 5,P2
  • 6,P3
  • 1,A1
  • 2,A2
  • 3, A3
  • 7,P4
  • 8,頂部

注:

  • 任何的ItemID可以具有0,1或> 1的父母。
    • 那些沒有父母的人將被列在輸出的頂部。
  • 我沒有參考表中「最頂級父母」的NULL值。

我希望我已經提供了足夠多的細節,並且給自己解釋得足夠多,以獲得一些反饋。任何想法將不勝感激!

+4

歡迎的SO。非常感謝您證明您是如何嘗試解決問題的,否則看起來您只希望我們爲您編寫代碼。 –

回答

1

我認爲實現這一目標的方法是使用遞歸操作並根據其所有子項的權重爲每個節點分配權重。

例如,此樹中的任何葉子都將具有零權重,因爲它沒有任何子級。它的直接父母將是1,父母的父母2等等。根據體重排序應返回您需要的結果集。下面是我用來測試我的理論的遞歸函數:

CREATE FUNCTION [dbo].[GetItemWeight](@ItemID int) 
RETURNS int 
BEGIN 

DECLARE @Weight int; 

SELECT 
    @Weight = COUNT(ParentID) 
FROM 
    [References] 
WHERE 
    ChildID = @ItemID; 

SELECT 
    @Weight = ISNULL(@Weight, 0) + SUM(dbo.GetItemWeight(ChildID)) 
FROM 
    [References] 
WHERE 
    ParentID = @ItemID; 

RETURN ISNULL(@Weight, 0); 
END 

返回的結果集你貼:

SELECT ItemID, Name FROM ItemMaster ORDER BY dbo.GetItemWeight(ItemID); 

祝您好運:)

+0

這正是我所需要的。完美的作品!非常感謝你! – user1644886

+0

不客氣,歡迎來到堆棧溢出:) – RollingCog

+0

只需跟進。上述工作完全適用於我的測試數據集,但是當它跨越我的「真實」數據運行時,我得到「超過最大存儲過程,函數,觸發器或視圖嵌套級別(限制32)」。錯誤。 我正在研究替代技術,但是你碰巧知道我怎麼可能採取你指定的內容並修改\改進它,以便可以避免錯誤。 再次感謝! – user1644886

相關問題