2013-12-10 1 views
0

포럼 게시물을 저장하는 SQL 테이블이 있습니다. 각 레코드에는 다른 레코드의 ID 인 ParentID가 있습니다. null 인 경우는 메인 포럼 스레드이므로 상위 레코드가 없습니다. 모든 게시물에는 여러 수준의 하위 항목이있을 수 있습니다. 나는 효율적으로 자식 레코드를 통해 마지막으로 생성 된 레코드를 찾는 함수를 찾고있다. 각 레코드는 '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

Youbody right @Bohemian – Osprey

답변

1

난 당신이 밀접하게 응답하고 잘못했기 때문에 내 첫 번째 대답을 삭제 읽기 : 도움이된다면

, 여기에 테이블의 기본 구조입니다. 다음은 "TopLevelForumID"필드를 사용하여 모든 관련 포럼을 그룹화하는 설치 및 재귀 CTE 쿼리를 포함하는 솔루션이 포함 된 SQL FIDDLE입니다. 이 쿼리는 효율적이어야하지만 테이블 통계에 따라 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