【问题标题】:Returning all nodes in the tree in SQL在 SQL 中返回树中的所有节点
【发布时间】:2015-10-06 09:07:56
【问题描述】:

我有一个列出公司的表,以及一个将这些公司链接在一起以形成所有权层次结构的表:

dbo.供应商:

  • 身份证
  • 姓名

dbo.SupplierLinks:

  • 供应商 ID
  • 父母身份

我想创建一个存储过程(或函数?),它接受供应商 ID,并返回所有链接(直接或间接)供应商的行。

当然,这不会返回间接链接的供应商:

DECLARE @SupplierId int
SET @SupplierId = 5

SELECT * 
FROM Config.SupplierLinks sl
WHERE sl.ParentId = @SupplierId
OR sl.SupplierId = @SupplierId

我怎样才能做到这一点?

例子:

Supplier 1
   |
  / \
2    3
     |
    /\
   5  4

数据:

Id      ParentId        Name

4       3               'Supplier 4'
5       3               'Supplier 5'
3       1               'Supplier 3'
2       1               'Supplier 2'

*注意:Supplier 1,顶级父级,在上面的链接表中不存在。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

看看Recursive Queries Using Common Table Expressions

;WITH Parents
AS
(
    Select SP1.SupplierId , SP1.ParentId from SupplierLinks SP1 where SP1.SupplierId = @SupplierId
    Union All
    Select SP2.SupplierId , SP2.ParentId
    From SupplierLinks SP2 Inner Join Parents C on C.ParentId = SP2.SupplierId
)

Decalare @ParentId int
Select @ParentId = P.SupplierId
From Parents as P
Where parentid = 0 or ParentId is null

;WITH Children
AS
(
    Select SP1 .SupplierId , SP1 .ParentId from SupplierLinks SP1 where SupplierId = @ParentId
    Union All
    Select SP2.SupplierId , SP2.ParentId
    From SupplierLinks SP2 Inner Join Children C on C.SupplierId = SP2.parentid
)

【讨论】:

  • 这很好用,谢谢。但是,它似乎没有返回链接到 SP1 的供应商记录? (换句话说,下树)。我需要添加另一个 Union All 吗?我仍在试图弄清楚构造查询...
  • 可能你需要先获取父级,然后再查找子级记录。尝试更新答案
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2021-09-10
  • 2018-10-31
相关资源
最近更新 更多