假设我有一个名为'species'的表格有3列:'Id','ancestorId'和'name'。 'ancestorId'是祖先物种的'Id',例如,如果智人的祖先是南方古猿,而南方古猿的'Id'是5,那么智人的'祖先'是5.我们也说,有一个名为'First specie'的物种,其'Id'为0或null。所以我想要的是选择一个特定物种的祖先列表,比如说智人,到“第一个物种”,无论路上有多少个节点。这可能与SQL有关吗?
答案 0 :(得分:3)
Managing Hierarchical Data in MySQL对于您所谈论的内容来说是一个很好的资源,特别是如果您正在使用没有递归查询支持的数据库系统。它讨论了如何构建数据以便更轻松地执行您想要的操作。
答案 1 :(得分:3)
ANSI方式是使用递归WITH子句:
WITH hierarchy AS (
SELECT t.id,
t.name,
t.ancestor
FROM TABLE t
WHERE t.ancestor IS NULL
UNION
SELECT t.id,
t.name,
t.ancestor
FROM TABLE t
JOIN hierarchy h ON h.ancestorid = t.id)
SELECT *
FROM hierarchy
支持者:
自v2以来,Oracle使用CONNECT BY
语法支持分层查询。
答案 2 :(得分:0)
是的,我可以在SQL中使用它。您可以为此目的使用递归查询。看看here。阅读整页。
WITH req_query AS
(
SELECT id,
name,
ancestorid
FROM your_table
WHERE name='homo sapiens' //If you want to search by id, then change this line
UNION
SELECT yt.id,
yt.name,
yt.ancestorid
FROM your_table yt,
req_query rq
WHERE yt.id = rq.ancestorid
AND rq.id != 0
AND rq.id is not null
)
SELECT *
FROM req_query
;
修改强> 这将适用于ORACLE,SQL Server,PostgreSQL以及任何其他具有递归查询支持的数据库。要处理不支持递归查询的数据库,您必须使用嵌套集模型。
答案 3 :(得分:0)
WITH hierarchy AS (
SELECT t.id,
t.name,
t.ancestor
FROM TABLE t
WHERE t.ancestor IS NULL
UNION
SELECT t.id,
t.name,
t.ancestor
FROM TABLE t
JOIN hierarchy h ON h.ancestorid = t.id)
SELECT *
FROM hierarchy
答案 4 :(得分:0)
你很可能不想让你的第一个物种的ID为null。 null与0非常不同.null表示您不知道该值是什么。 0表示该值为0.请注意,null<> null和0 = 0.这可能会影响您搜索识别物品的方式。