【问题标题】:SQL Recursion, Retrieve Orders based on Product and parent ProductSQL递归,根据产品和父产品检索订单
【发布时间】:2022-01-27 16:24:39
【问题描述】:

我想要一个基于关联的“产品”返回“订单”的 SQL 查询,“产品.DepositId”必须等于一个精确的整数值(例如 Product.DepositId = 1)。

如果关联的 'Product.DepositId' 为空,则查询需要使用 'Product.ParentId' 沿着 Product 阶梯向上获取父级 'Product',依此类推。

  • “产品”父层次结构可以进入“N”层/层。 (例如 Child -> ChildParent -> ChildParent -> Final Parent)
  • 多个“产品”子级可以关联到同一个父级
  • 只有最顶层的父“产品”会有一个 DepositId。因此,如果“Product.ParentId”为空,则“Product.DepositId”不会为空
  • “订单”可以与子“产品”或父“产品”相关联。 (家长也可以有订单。)

例如(为了简单起见,我使用整数 ID 代替唯一标识符)

产品

Id  ParentId  DepositId
1   NULL      10
2   NULL      20
3   1         NULL
4   2         NULL
5   1         NULL
6   3         NULL

订单

Id      ProductId
1001    1
1002    2
1003    3
1004    4
1005    5
1006    6

DepositId = 10 的预期结果订单

OrderId  ProductId
1001     1           --Because Product 1 DepositId = 10
1003     3           --Because Product 3 is child of Product 1
1005     5           --Because Product 5 is child of Product 1
1006     6           --Because Product 6 is child of Product 3 which in 
                       turn is a child of Product 1

【问题讨论】:

  • minimal reproducible example 在询问 SQL 问题时是一个很好的开始。
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql


【解决方案1】:

这需要递归 CTE。

;with rcte_products as (
  select Id as ProductId, ParentId
  , DepositId
  , 0 as Lvl
  , Id as BaseId
  from Products
  where DepositId = 10
  
  union all
  
  select t.Id, t.ParentId
  , c.DepositId
  , c.Lvl+1
  , c.BaseId
  from rcte_products c
  join Products t on t.ParentId = c.ProductId
)
select 
  o.Id as OrderId
, o.ProductId
from rcte_products c
join Orders o 
  on o.ProductId = c.ProductId
order by o.Id;
OrderId ProductId
1001 1
1003 3
1005 5
1006 6

dbfiddle here

上的演示

【讨论】:

  • 仅供参考,DepositId & Lvl & BaseId 可以从 CTE 中删除。这只是测试递归的额外信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2014-11-15
  • 2017-06-18
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多