sql - 列出所有祖先路径,LIKE vs rcte
问题描述
DROP TABLE IF EXISTS t;
CREATE TABLE t(
mypath varchar(100),
parent_path varchar(100)
);
INSERT INTO t VALUES ('a', NULL),('a/b', 'a'),('a/b/c', 'a/b');
-- 列出所有父路径
1) 使用 LIKE,不使用 parent_path 列:
SELECT a.mypath, b.mypath aS parent_path
FROM t a
JOIN t b ON a.mypath LIKE b.mypath + '%' AND a.mypath != b.mypath
2) 使用递归 cte,利用 parent_path 列
WITH cte AS (
SELECT mypath, parent_path
FROM t
UNION ALL
SELECT a.mypath, b.parent_path
FROM cte a
JOIN t b ON a.parent_path = b.mypath
)
SELECT * FROM cte WHERE parent_path IS NOT NULL;
在大型数据集上,每种方法的优缺点是什么,性能方面?我认为 rcte 方法应该更快吗?LIKE 是否应该能够使用索引,因为只有一个尾随通配符?
解决方案
推荐阅读
- node.js - 无法连接到在 WSL2 中运行的本地 Node.js 服务器
- linux - 我可以在脚本中测量 Expect 命令的执行时间吗?
- python - 如何在 selenium webdriver python 中通过验证码?
- python - 在python中解析未格式化的字符串
- c# - 通过客户端 API 获取错误的 Kubernetes pod 状态
- vuejs2 - 当后退按钮单击混合应用程序时如何防止应用程序关闭
- java - 如何在 android datepicker 中突出显示日期?
- scala - 尾递归如何在scala内部工作?
- java - IntelliJ - 用包含相应类名的参数替换空参数记录器
- javascript - 下拉更改事件未在 IE 中触发