选择父行及其子代和大子代

问题描述 投票:0回答:1

我有一张注释表,我正在努力实现能够选择根注释(`ParentCommentId = 0),然后从我得到的父注释中选择所有孩子以及那些孩子的孩子,然后依此类推

例如,我将返回CommentId = 1038的行。我也想要它的子对象(CommentId = 1039),因为它是ParentCommentId = 1038,然后也要它是CommentId = 1040,因为它是ParentCommentId = 1039等。

enter image description here

我尝试了以下查询,因为我认为自己的方向正确。

SELECT *
FROM 
    (SELECT 
         c.CommentId,
         c.PostId,
         c.Comment,
         c.ParentCommentId,
         c.CommentDateTime
     FROM 
         [gallery].[Comments] c
     INNER JOIN 
         [player].[Players] p ON p.UserId = c.UserId 
     WHERE 
         c.PostId = 32
         AND ParentCommentId = 0) AS ParentComments
JOIN
    (SELECT 
         c.CommentId,
         c.PostId,
         c.Comment,
         c.ParentCommentId,
         c.CommentDateTime
     FROM 
         [gallery].[Comments] c
     INNER JOIN 
         [player].[Players] p ON p.UserId = c.UserId 
     WHERE 
         c.PostId = 32
         AND ParentCommentId != 0) AS ChildComments ON ParentComments.CommentId = ChildComments.ParentCommentId

但是我肯定会找回错误的数据,就像孩子与父母在同一行中一样,理想情况下,我希望孩子是分开的行。它也只能深入1个孩子,肯定会丢失很多评论(比下面的5个要多得多)。我似乎只得到一个基本注释,它是第一个孩子,而不是没有孩子或没有注释的大孩子。

enter image description here

sql-server database tsql
1个回答
0
投票

您可能会丢失数据,因为您使用了inner join。这对于祖父母不在表格中的情况是有问题的,例如:

© www.soinside.com 2019 - 2024. All rights reserved.