小编典典

在SQL中这可能吗?

sql

假设我有一个名为“ species”的表,该表包含3列:“ Id”,“ ancestorId”和“ name”。“ ancestorId”是祖先物种的“
Id”,因此,例如,如果高智人的祖先是南方古猿,而南方古猿的“ Id”是5,那么高智人的“祖先Id”是5。有一个名为“第一类”的物种,其“
Id”为0或为null。所以我想要的是从一个特定物种(例如,智人)到“第一物种”中选择一个祖先列表,无论途中有多少个节点。SQL可能吗?


阅读 151

收藏
2021-04-22

共1个答案

小编典典

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

支持:

  • SQL Server 2005以上版本
  • Oracle 11gR2
  • PostgreSQL 8.4+

从v2开始,Oracle使用CONNECT BY语法提供了分层查询支持。

2021-04-22