写一个sql查询它的子级,如果有子级再查询子级的子级,如图

select id, from table where compid = 1 这样查出来的就是14,15,17;
如果再查有一层的话就是select * from table where comid in (select id, from table where compid = 1)但是如果一直有子级怎么办?查询该怎样写
最新回答
ミ猫田喂山风

2026-10-21 15:43:29

公共表查询,应该是你想要的!可能跟你想要的还有点差别,不过在sql里实现递归的话就用公共表表达式with,楼主你再根据自己需要改吧。
给你个例子:(抄别人的)
CREATE TABLE [tb_loc](
[id] [int],
[name] [varchar](16),
[parent] [int]
)

INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)
INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)
INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)
INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)
INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)
INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)
INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)
INSERT tb_loc(id,name,parent) VALUES( 11,'大郭村北',8)
INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)
INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)
INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)
INSERT tb_loc(id,name,parent) VALUES( 15,'桥西区',3) ;

WITH locs(id,name,parent,loclevel)
AS
(
SELECT id,name,parent,0 AS loclevel FROM tb_loc
WHERE parent IS NULL
UNION ALL
SELECT l.id,l.name,l.parent,loclevel+1 FROM tb_loc l
INNER JOIN locs p ON l.parent=p.id
)

SELECT * FROM locs;
如梦如幻

2026-08-01 18:10:22

???有点看不懂~
有子级就加子查询吧,一直有子级,那就是设计表设计得不好的问题了!
陌玍旳对白

2026-01-14 03:41:30

有子级就加子查询
下一個街角

2026-02-19 02:03:51

要看你是什么数据库,如果是oracle很容易实现的
收起 3条折叠回答