0

私は次のように構造化されたSQLサーバーにコメントテーブルを持っています

CREATE TABLE [dbo].[LS_Commentes](
    [CommentId] [int] IDENTITY(1,1) NOT NULL,
    [OwnerId] [uniqueidentifier] NULL,
    [OwnerName] [nvarchar](50) NULL,
    [Email] [nvarchar](250) NULL,
    [Date] [nvarchar](15) NULL,
    [ParentId] [int] NULL,
    [CommentText] [nvarchar](400) NULL,
    [ItemId] [int] NULL,
    [upVotes] [int] NULL,
    [downVotes] [int] NULL,
    [isApproved] [bit] NULL,
 CONSTRAINT [PK_LS_MsgCommentes] PRIMARY KEY CLUSTERED 
(
    [CommentId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

そして、私は次のようなサンプルデータを持っています:

CommentId   OwnerId OwnerName   Email   Date    ParentId    CommentText ItemId  upVotes downVotes   isApproved
1   NULL    Test Commneter  NULL    1/4/2013    NULL    test    9   0   0   NULL
2   NULL    Test Commneter  NULL    1/4/2013    1   test    NULL    0   0   NULL
3   NULL    Test Commneter  NULL    1/4/2013    1   test    NULL    0   0   NULL

私は1つのクエリを書きたいので、すべての行にitemid = 9があり、行には選択されたparentid =コメントIDがあります(itemid = 9のため)

ここを見て サブコメントにもアイテムID 9を追加することで解決できますが、コメントとサブコメントにアイテムIDを追加せずに解決できるかどうか知りたいだけです

4

3 に答える 3

1

再帰的な共通テーブル式は、求めている結果をもたらしますか?

;with cte as 
(
    --Anchor
    select 
        commentid,
        ParentId
    from 
        LS_Commentes
    where
        ItemId = 9
    union all
    --Recursive member
    select 
        c.commentId,
        c.ParentId
    from
        LS_Commentes c join cte on c.ParentId = cte.CommentId

)
select * from cte

結果にさらに列を含める場合は、両方の部分 (アンカーと再帰メンバー) に同じ列があることを確認してください。

説明: 再帰クエリのアンカー部分 (最初の選択) は、ItemId = 9 のすべての行を選択し、2 番目の部分は、結果の既存のレコードを使用して、その条件 (ParentId = cte.CommentId) を満たす追加のレコードを含めます。何も選択されなくなるまで。そして、最後に結果全体を選択する必要があります (CTE 定義の後)。

于 2013-01-04T22:47:02.387 に答える
1

次のクエリはあなたが望むことをすると思います:

select *
from ls_comments c
where c.itemID = 9 or
      c.parentID in (select c2.commentId from ls_comments c2 where c2.itemId = 9)
于 2013-01-04T22:45:22.493 に答える
0

埋め込みSQLクエリでいいと思います

 SELECT * 
 FROM `LS_Commentes` 
 WHERE `ItemId` = '9' 
     AND `ParentID`= (SELECT `CommentID` FROM `LS_Commentes` WHERE `ItemId` = 9);
于 2013-01-04T22:47:13.650 に答える