我的SQL表看起来像这样
CREATE TABLE [CONTENTS].[ID]
(
[ID] NVARCHAR (20) NOT NULL,
[NAME] NVARCHAR (MAX) NOT NULL,
[CONTENT] NVARCHAR (MAX) NULL,
[PARENT_ID] NVARCHAR (20) NOT NULL,
[TYPE] INT NOT NULL,
[SHARED] INT NOT NULL,
[CREATED] DATETIME NULL,
[ICON] VARBINARY (MAX) NULL,
[UPDATED] DATETIME NULL
);
除了一些主要项目外,每个项目都有父项目。我需要获取所需项目Parent,Parent of Parent,直到该项目没有父项..
我使用了以下查询
DECLARE @ID nvarchar(max)='12843686753443770653';
WAY:
SET @ID = (SELECT PARENT_ID FROM CONTENTS.ID WHERE (ID = @ID))
SELECT *
FROM CONTENTS.ID
WHERE (ID = @ID)
IF @ID!='JKParthiban' GOTO WAY
我得到了这个结果:
我需要在一组而不是多组中获得所有结果。
答案 0 :(得分:2)
您可以使用递归cte来获得结果
DECLARE @ID nvarchar(max)='12843686753443770653';
;with cte as (
select id, name from contentsid where id = @ID
union all
select ci.ID, ci.name from cte c inner join contentsid ci
on c.id = ci.PARENT_ID
) select * from cte
答案 1 :(得分:0)
Union All是最常用的方法......您可以通过这种方式将完全不同的查询合并为一个。在提供需要单个数据集的Crystal Reports时,我经常合并不相似的数据。我为数据类型添加了一列,以确定数据与哪些不同的合并查询相关。
答案 2 :(得分:0)
来自@Kannan回答我做了一些小改动。它给出了我所需的结果
DECLARE @ID nvarchar(max)='20702008786843307405';
WITH CTE AS
(SELECT ID, NAME,PARENT_ID from CONTENTS.ID where ID = @ID UNION ALL SELECT CI.ID, CI.NAME, CI.PARENT_ID from CTE C inner join CONTENTS.ID CI
ON C.PARENT_ID = CI.ID) SELECT * FROM CTE