【问题标题】:SQL Server - Loop through self-join multiple times [duplicate]SQL Server - 多次循环自加入[重复]
【发布时间】:2020-07-08 06:49:14
【问题描述】:

我有一个续集表,如下所示。它是产品和子产品的列表。每个产品可以有多个孩子,每个孩子可以有更多的孩子。我想提取所有产品的这棵树的每一层。下面是输入和输出的示例。谢谢

+------+---------+------+
| Prod | Child P | Qty  |
+------+---------+------+
|    A |       B | 1    |
|    A |       C | 2    |
|    A |       D | 1    |
|    B |       E | 2    |
|    C |       F | 2    |
|    F |       J | 4    |
+------+---------+------+

我想编写 T-SQL 代码来获取整个产品树。我期望输出如下:

+------+---------+------+---------+
| Prod | Child P | Qty  | Level   |
+------+---------+------+---------+
|    A |       B | 1    |    1    |
|    A |       C | 2    |    1    |
|    A |       D | 1    |    1    |
|    A |       E | 2    |    2    |
|    A |       F | 2    |    2    |
|    A |       J | 4    |    3    |
|    B |       E | 2    |    1    |
|    C |       F | 2    |    1    |
|    C |       J | 4    |    2    |
|    F |       J | 4    |    1    |
+------+---------+------+---------+

有没有办法在 T-SQL 查询而不是存储过程中做到这一点?

【问题讨论】:

  • 你搜索过parent child cte吗?

标签: sql-server loops tsql self-join


【解决方案1】:

这将为您解决。

DECLARE @Product TABLE
(
    Prod VARCHAR(10)
  , ChildProd VARCHAR(10)
  , Qty INT
);

INSERT INTO @Product (Prod, ChildProd, Qty)
VALUES
('A', 'B', 1),
('A', 'C', 2),
('A', 'D', 1),
('B', 'E', 2),
('C', 'F', 2),
('F', 'J', 4)

;WITH cteProduct AS
(
    SELECT Prod
         , ChildProd
         , Qty
         , 1 AS Level 
    FROM @Product
    UNION ALL
    SELECT
               cte.Prod
             , p.ChildProd
             , p.Qty
             , cte.Level + 1
    FROM       @Product   p
    INNER JOIN cteProduct cte ON p.Prod = cte.ChildProd
)
SELECT
         cteProduct.Prod
       , cteProduct.ChildProd
       , cteProduct.Qty
       , cteProduct.Level
FROM     cteProduct
ORDER BY cteProduct.Prod
       , cteProduct.ChildProd;

Demo.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2012-04-01
    • 2011-03-06
    相关资源
    最近更新 更多