Sql 表自相关查询

Sql 表自相关查询,sql,tsql,Sql,Tsql,我有一张具有自我关系的桌子: id—parentId列 我需要一个查询来获取parentId为null的父行,但我无法找到正确的方法 select * from table1 where id = parentId; 显然这不起作用,它只会给直接的父母 任何帮助“获取parentId为null的父行”都没有意义,但如果您实际上是指“获取父行,直到父ID为null为止”,那么此递归应该可以实现以下目的: SELECT * FROM table1 AS A LEFT JOIN table1 a

我有一张具有自我关系的桌子:

id—parentId列

我需要一个查询来获取parentId为null的父行,但我无法找到正确的方法

select * from table1 where id = parentId;
显然这不起作用,它只会给直接的父母

任何帮助

“获取parentId为null的父行”都没有意义,但如果您实际上是指“获取父行,直到父ID为null为止”,那么此递归应该可以实现以下目的:

SELECT *

FROM table1 AS A

LEFT JOIN table1 as B
  ON B.ID = A.parentID

WHERE B.parentID IS NULL
WITH cte AS (
    SELECT * FROM table1 WHERE id = 7
    UNION ALL
    SELECT table1.* FROM table1 JOIN cte ON table1.id = cte.parentId
)
SELECT * FROM cte

这将递归返回id=7的行及其所有祖先。根据您的需要替换7。

这没有意义:“获取parentId为null的父行”-如果parentId为null,这不意味着没有父行吗?您可以使用递归CTE执行此操作:@driis:我认为他的意思是获取“超级”父行。父对象的父对象的父对象,直到没有更多的父对象。是否将“超级”父对象作为需要查找的行,即从某个节点遍历层次结构到顶部?然后,递归CTE是一种方法,至少如果您使用的是支持它的SQL风格(MSSQL 2005和更高版本)。SQL标签上的提示是:如果您给我们样本数据和预期结果数据,您将得到一个预处理的答案。它没有带来所有结果,某些行丢失可能会添加一个您正在寻找的示例:)