常见问题,给一个记录ID,查出它的所有父级,直到顶级

使用SMSS,sql server,找到一个办法.

思路是分两步,先循环找到所有父级的ID,再用IN查出所有父级

列说明  ID=PK  ParentId = 上级ID  ParentId = 0 表示到顶级了

SQL语句 :

DECLARE @childrenId VARCHAR(32)     -- 要查找这个ID的所有父级
DECLARE @1parentIds VARCHAR(max) -- 所有父级的ID列表,最终拼成IN的条件.效果如: '111','222','333'

SET @1parentIds = ''''+@childrenId+''''      -- 也包含自己,一直到父级

WHILE @childrenId!='0'         -- 如果父级ID不是0就继续查找
BEGIN
  SELECT @childrenId = ParentId FROM [table] WHERE  Id=@childrenId -- 根据ID找到这个记录,将它的父ID赋值,这个父ID作为下一级的子ID查找
  SET @1parentIds= @1parentIds + ',' + '''' + @childrenId + ''''                    -- 拼接这个父ID
END

-- 由于拼接的字符串不能做IN的参数,所以想这个办法将整个SQL拼成再执行之.

EXEC('SELECT * FROM [table] WHERE Id IN (' + @1parentIds + ')'+'ORDER by Id')

05-03 22:33