是否可以在SQL Server中将多组结果转换为单组结果?

时间:2016-09-07 16:03:06

标签: sql sql-server

我的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

我得到了这个结果:

enter image description here

我需要在一组而不是多组中获得所有结果。

3 个答案:

答案 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