SQL每日一题(20210315)

题目

有如下一张表T0311
在这里插入图片描述
希望得到如下结果:
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVDTQWUh-1615905813416)(./images/结果-每日一题20210315.png)]

即根据父ID(PARENTID)来逐级显示产品名和层级序号

测试数据

CREATE TABLE T0315(
   ID INT,
   PRODUCTNAME VARCHAR(64),
   PARENTID INT,
)
 
INSERT INTO T0315 VALUES ( 1,'汽车',NULL)
INSERT INTO T0315 VALUES ( 2,'车身',1)
INSERT INTO T0315 VALUES ( 3,'发动机',1)
INSERT INTO T0315 VALUES ( 4,'车门',2)
INSERT INTO T0315 VALUES ( 5,'驾驶舱',2)
INSERT INTO T0315 VALUES ( 6,'行李舱',2)
INSERT INTO T0315 VALUES ( 7,'气缸',3)
INSERT INTO T0315 VALUES ( 8,'活塞',3)

参考答案

官方答案:

;WITH CTE AS
(
	SELECT ID,PARENTID,PRODUCTNAME,0 CTELEVEL,CAST(ID AS VARCHAR) ORDERID
	FROM T0315
	WHERE ID=1
	UNION ALL
	SELECT
	A.ID,A.PARENTID,A.PRODUCTNAME,B.CTELEVEL+1,CAST(B.ORDERID+'->'+LTRIM(A.ID) AS VARCHAR)
	FROM T0315 A
	INNER JOIN CTE B ON B.ID=A.PARENTID
)
SELECT ID,PARENTID,
RIGHT('        ',4*CTELEVEL)+PRODUCTNAME PRODUCTNAME,ORDERID
FROM CTE
ORDER BY ORDERID

考点: WITH CTE AS(XX UNION ALL CTE)RIGHT()LTRIM()

说明:在with块中继续使用CTE变相使用递归思想

参考:SQL每日一题(20210315)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值