2

既出でしたら申し訳ありませんが、検索しても出てきませんでした。

私は次の表を持っています

CREATE TABLE [dbo].[emp](
    [id] [int] NOT NULL,
    [name] [varchar](20) NULL,
    [mgrid] [int] NULL
) ON [PRIMARY]

データあり

INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (1, N'a', 0)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (2, N'a1', 1)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (3, N'a11', 2)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (4, N'a12', 2)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (5, N'a13', 2)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (6, N'a2', 1)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (7, N'a3', 1)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (8, N'a31', 7)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (9, N'a32', 7)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (10, N'b', 0)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (11, N'b1', 10)
INSERT [dbo].[emp] ([id], [name], [mgrid]) VALUES (12, N'b2', 10)

そして、次の出力が欲しい

a
    a1
        a11
        a12
        a13
    a2
    a3
        a31
        a32
b
    b1
    b2

これは SQL Server で可能ですか?

4

5 に答える 5

1
with CTE as
(
  select *
    , level = 1
  from emp
  where mgrid = 0
  union all
  select emp.id,
    name = cast(space((level) * 3) + emp.name as varchar(20)),
    emp.mgrid,
    level = level + 1
  from emp
    inner join CTE on CTE.id = emp.mgrid
)
select name
from CTE
order by ltrim(name)
于 2013-05-07T11:16:29.530 に答える
1

CTE(これを実現するための共通テーブル式)を使用できます

このサンプル コードを確認してください。

declare @emp table(
    [id] [int] NOT NULL,
    [name] [varchar](20) NULL,
    [mgrid] [int] NULL
) 


INSERT @emp ([id], [name], [mgrid]) VALUES (1, N'a', 0)
INSERT @emp ([id], [name], [mgrid]) VALUES (2, N'a1', 1)
INSERT @emp ([id], [name], [mgrid]) VALUES (3, N'a11', 2)
INSERT @emp ([id], [name], [mgrid]) VALUES (4, N'a12', 2)
INSERT @emp ([id], [name], [mgrid]) VALUES (5, N'a13', 2)
INSERT @emp ([id], [name], [mgrid]) VALUES (6, N'a2', 1)
INSERT @emp ([id], [name], [mgrid]) VALUES (7, N'a3', 1)
INSERT @emp ([id], [name], [mgrid]) VALUES (8, N'a31', 7)
INSERT @emp ([id], [name], [mgrid]) VALUES (9, N'a32', 7)
INSERT @emp ([id], [name], [mgrid]) VALUES (10, N'b', 0)
INSERT @emp ([id], [name], [mgrid]) VALUES (11, N'b1', 10)
INSERT @emp ([id], [name], [mgrid]) VALUES (12, N'b2', 10);


with cte (id,name, MGRID) as
(
    select id, name,MGRID
    from @emp
    union all
    select c.id, c.name, c.MGRID
    from @emp c
    inner join cte p
        on c.mgrid = P.id
)


SELECT Distinct * FROM CTE
于 2013-05-07T11:20:07.063 に答える