Sql 列出所有祖先路径,如vs rcte

Sql 列出所有祖先路径,如vs rcte,sql,sql-server,sql-like,recursive-query,Sql,Sql Server,Sql Like,Recursive Query,--列出所有父路径 1) 使用LIKE,不使用parent_path列: 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'); 2) 使用递归cte,利用父路径列 SELECT a.mypath, b.mypath aS p

--列出所有父路径

1) 使用LIKE,不使用parent_path列:

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');

2) 使用递归cte,利用父路径列

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

在大型数据集上,从性能角度来看,每种方法的优缺点是什么? 我认为rcte方法应该更快,对吗?
您是否希望能够使用索引,因为只有一个尾随通配符?

我倾向于使用范围键。一旦建立,导航和/或聚合就变得非常容易。这些数据是否过于简化?如果不是的话,
hierarchyid
在这里不是更好的套件吗?你是说从FK到int PK?是的,这可能是个好主意。您可以自己轻松地进行测试,并使用实际查询检查实际数据的执行计划。性能问题几乎总是高度特定于模式、查询和数据。
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;