在一个表中插入一个人员的全部上级数据

小白619 2018-12-21 03:22:25


张三的上级是李四,
李四的上级是王五,
王五的上级是赵六,
表中的数据是李四、王五、赵六是张三的所有上级,现在要将他们这些数据全部插入到A表中。
如果插入的是张三的上级,则将张三、李四、王五、赵六全部插入到A表中,如果插入的是李四的上级,则将李四、王五、赵六插入到A表中。

会同时插入多个人的上级信息,这个怎么写语句呢?请教大神?
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-12-21
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT PRIMARY KEY,
	[name] NVARCHAR(10),
	[manageid] INT	
)
GO
SET NOCOUNT ON
INSERT INTO t VALUES (1,'张三',2)
INSERT INTO t VALUES (2,'李四',3)
INSERT INTO t VALUES (3,'五五',4)
INSERT INTO t VALUES (4,'赵六',0)

--查所有人的所有上级,并插入到A表
--1. 
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
--2.
;WITH cte AS (
	SELECT id  AS oid, * FROM t
	UNION ALL
	SELECT b.id AS oid, a.* FROM t AS a INNER JOIN cte AS b ON a.id=b.[manageid]
)
SELECT * 
,STUFF((SELECT ','+ b.name FROM cte AS b WHERE a.id=b.oid AND a.id!=b.id FOR XML PATH('')),1,1,'') AS leaderNames
INTO A
FROM t AS a

SELECT * FROM A
/*
id          name       manageid    leaderNames
----------- ---------- ----------- -------------------
1           张三         2           李四
2           李四         3           五五,五五
3           五五         4           赵六,赵六,赵六
4           赵六         0           NULL
*/
Dear SQL(燊) 2018-12-21
  • 打赏
  • 举报
回复
插入A 表在最一个select 前面加insert into a INNER JOIN cte AS b ON a.id=b.[manageid] ) insert into 表A SELECT * FROM cte order by orgid
二月十六 版主 2018-12-21
  • 打赏
  • 举报
回复
额,这个和上次那个有什么不一样吗?还是就是插入不会写,加一个insert 就行了
--测试数据
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([id] int,[name] nvarchar(22),[manageid] int)
Insert #T
select 1,N'张三',2 union all
select 2,N'李四',3 union all
select 3,N'王五',4 union all
select 4,N'赵六',0
GO
if not object_id(N'Tempdb..#A') is null
    drop table #A
Go
Create table #A([id] int,[name] nvarchar(22),[manageid] int)
--测试数据结束
;WITH cte AS (
Select * from #T WHERE name = '李四' --这里写的是想查谁的
UNION ALL
SELECT #T.* FROM #T JOIN cte ON cte.manageid = #T.id
)
INSERT INTO #A		--插入数据
SELECT * FROM cte

SELECT * FROM #A		--读取结果
Dear SQL(燊) 2018-12-21
  • 打赏
  • 举报
回复
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
GO
CREATE TABLE #t(
    id INT PRIMARY KEY,
    [name] NVARCHAR(10),
    [manageid] INT   
)
GO
SET NOCOUNT ON
INSERT INTO #t VALUES (1,'张三',2)
INSERT INTO #t VALUES (2,'李四',3)
INSERT INTO #t VALUES (3,'五五',4)
INSERT INTO #t VALUES (4,'赵六',0)
  
;WITH cte AS (
    SELECT orgid=a.id,orgname=[name],a.* 
    FROM #t a
    UNION ALL
    SELECT b.orgid,b.orgname,a.* 
    FROM #t AS a 
    INNER JOIN cte AS b ON a.id=b.[manageid]
)
SELECT * FROM cte
order by orgid

orgid       orgname    id          name       manageid
----------- ---------- ----------- ---------- -----------
1           张三         1           张三         2
1           张三         2           李四         3
1           张三         3           五五         4
1           张三         4           赵六         0
2           李四         3           五五         4
2           李四         4           赵六         0
2           李四         2           李四         3
3           五五         3           五五         4
3           五五         4           赵六         0
4           赵六         4           赵六         0


Dear SQL(燊) 2018-12-21
  • 打赏
  • 举报
回复
IF OBJECT_ID('#t') IS NOT NULL DROP TABLE #t
GO
CREATE TABLE #t(
    id INT PRIMARY KEY,
    [name] NVARCHAR(10),
    [manageid] INT   
)
GO
SET NOCOUNT ON
INSERT INTO #t VALUES (1,'张三',2)
INSERT INTO #t VALUES (2,'李四',3)
INSERT INTO #t VALUES (3,'五五',4)
INSERT INTO #t VALUES (4,'赵六',0)
  
--查李四(id=2)的所有上级
;WITH cte AS (
    SELECT orgid=a.id,a.* 
    FROM #t a
    UNION ALL
    SELECT b.orgid,a.* 
    FROM #t AS a 
    INNER JOIN cte AS b ON a.id=b.[manageid]
)
SELECT * FROM cte
order by orgid

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧