我想运行查询来获取从 data1 到 data8 的所有 ORDER BY pos。
我拥有的是从 data1 到 data8 的所有节点的 id,但它们不按顺序排列。
我尝试过: @"SELECT * FROM myTable WHERE id IN ("15,16,17,18,19,20,21,22") ORDER BY pos ASC"; 但由于父母立场不同,结果并没有达到预期。
CREATE TABLE "tester" (
"id" INTEGER UNIQUE,
"pid" INTEGER,
"pos" INTEGER,
"nm" VARCHAR(255),
PRIMARY KEY("id" AUTOINCREMENT)
);
INSERT INTO 'tester' (id, pid, pos, nm)
VALUES (1, 0, 0, "My Tester"),
(2, 1, 0, "cat1"),
(4, 9, 1, "subcat1"),
(9, 1, 1, "cat2"),
(10, 2, 0, "subcat3"),
(13, 2, 1, "subcat2"),
(14, 9, 0, "subcat4"),
(15, 4, 0, "data1"),
(16, 4, 1, "data2"),
(17, 13, 0, "data3"),
(18, 13, 1, "data4"),
(19, 10, 0, "data5"),
(20, 10, 1, "data6"),
(21, 14, 0, "data7"),
(22, 14, 1, "data8")
;
结果应如下所示: 按位置订购。
数据5 数据6 数据3 数据4 数据7 数据8 数据1 数据2
您可以使用递归公共表表达式按照父子关系访问所有记录,并使用
order by
来确保节点的深度优先,或者节点具有相同的深度,pos
定义顺序访问。
然后,您可以从 CTE 选择您需要的内容,按所需的
id
过滤记录并选择名称:
with recursive depth_first(id, pos, nm, level) as (
select id, pos, nm, 0
from "tester"
where pid = 0
union all
select t.id, t.pos, t.nm, depth_first.level+1
from "tester" t
join depth_first
on t.pid = depth_first.id
order by 4 desc, 2
)
select nm
from depth_first
where id between 15 and 22;