2013-12-10 89 views
0

我有一個存儲論壇帖子的SQL表。每條記錄都有一個ParentID,它是另一條記錄的ID。如果它是空的,這意味着它是一個主要的論壇線程,因此沒有父記錄。每篇文章可以有多個級別的孩子。我正在尋找一個有效地通過子記錄再次發現最後創建的函數(每個記錄都有一個'Created'字段)的函數。在層次表中查找最後一條記錄的最有效方式

我的存儲過程列出了屬於特定父級的記錄,但它非常耗費CPU時間,並且在列出主論壇線程和顯示最後一個答覆的日期時無法使用。

如果有幫助,這裏是表的基本結構:

CREATE TABLE [dbo].[ForumThreads](
    [ForumThreadID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, 
    [ForumID] [numeric](18, 0) NULL, 
    [ParentID] [numeric](18, 0) NULL, 
    [PostSubject] [nvarchar](500) NULL, 
    [PostBody] [nvarchar](max) NULL, 
    [Created] [datetime] NULL, 
    [CreatedBy] [numeric](18, 0) NULL 
); 
+0

您是否嘗試過遞歸查詢?這裏是一個例子:http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx –

+0

我假設你是指在給定的ForumThreadID *下創建*的最後一個孩子? – Bohemian

+0

你認爲正確@Bohemian – Osprey

回答

1

我看了你仔細回答,並刪除了我的第一個答案,因爲它是錯誤的。這是一個帶有解決方案的SQL FIDDLE,該解決方案包含一個設置和遞歸CTE查詢,該查詢使用「TopLevelForumID」字段對所有相關論壇進行分組。此查詢應該是有效的,但根據您的表統計信息,您可以添加INDEX以提高響應速度。

SQL Fiddle

加標量值函數,它可以被稱爲像這樣:

-- How yo use this Scalar-valued function 
--SELECT [ForumThreadID] 
--  ,[ForumID] 
--  ,[ParentID] 
--  ,[PostSubject] 
--  ,[PostBody] 
--  ,[Created] 
--  ,[CreatedBy] 
--  ,[dbo].[fn_getLastThread]([ForumID]) AS [LastThread] 
-- FROM [dbo].[ForumThreads] 

CREATE FUNCTION [dbo].[fn_getLastThread] 
(
    @ParentForumID INT 
) 
RETURNS INT 
AS 
BEGIN 

    DECLARE @Ret INT; 

    -- recursive CTE query 
    WITH hierarchy AS (

      -- select the parent row 
      SELECT [ForumID],[ParentID],[Created] 
      FROM ForumThreads 
      WHERE [ForumID][email protected] 

      UNION ALL    
      SELECT A.[ForumID],A.[ParentID],A.[Created] 
      FROM ForumThreads A 
      INNER JOIN hierarchy H ON H.[ForumID] = A.[ParentID] 
    ) 
    SELECT  TOP 1 @Ret = [ForumID] 
    FROM  hierarchy 
    ORDER BY [Created] DESC 
    OPTION  (MAXRECURSION 50); -- specify recursion limit (default is 100 if not specified) 

    RETURN @Ret; 

END 
+0

當我運行代碼時,我得到一個錯誤:「語句終止,最大遞歸100在語句完成前已經耗盡。這可能是因爲涉及大量數據(撰寫本文時爲311572)。 我希望有一個內聯函數,ParentID作爲參數,我可以在列出最後20個新線程的查詢中使用。 雖然謝謝。 – Osprey

+0

一個函數很容易做...你期望的遞歸的最大數量是多少? SQL Server允許您爲遞歸指定一個限制,以防止其失控,缺省值爲100. – laylarenee

+0

如果函數返回多行(「表值」函數),您打算如何在單個函數中使用它查詢?你打算子查詢功能? – laylarenee

相關問題