我在sql server中的注释表结构为
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
我想写一个查询可以让我所有的行都有itemid = 9而行有parentid =选择的注释ID(因为itemid = 9)
看这里我可以通过在子评论中添加项目ID 9来解决它,但我只是想知道是否可以在不添加项目ID到评论和子评论的情况下解决这个问题
答案 0 :(得分: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)
答案 1 :(得分:1)
递归Common Table Expression是否会为您提供您所追求的结果?
;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
如果要在结果中包含更多列,请确保两个部分(Anchor和递归成员)具有相同的列。
说明: 递归查询的锚点部分(第一个选择)选择ItemId = 9的所有行,第二个部分使用结果中的现有记录来包含满足它的crite的更多记录(ParentId = cte.CommentId)这一直持续到没有选择了更多。然后必须在结束时(在CTE定义之后)选择整个结果
答案 2 :(得分:0)
我认为嵌入式SQL查询会很好
SELECT *
FROM `LS_Commentes`
WHERE `ItemId` = '9'
AND `ParentID`= (SELECT `CommentID` FROM `LS_Commentes` WHERE `ItemId` = 9);