多个子级SQL查询

时间:2016-10-04 14:53:52

标签: sql sql-server

我有一个包含两个表的数据库。第一个是部件号列表,第二个是与父部件关联的组件列表。

表1 - Inv

  • StockCode
  • ProductClass

表2 - Bom

  • ParentPart
  • 组件
  • QtyPer

第三个表是基本的销售订单明细表。

blow SQL命令返回Bom表中找到的所有项目,其中包含Product Product' FG'的部分。

    SELECT     SD.SalesOrderLine, SD.StockCode, SD.BackOrderQty*Bom.QtyPer AS TotalReq, 
               Bom.Component, SD.MLineShipDate
    FROM       SalesOrder SD
    JOIN       Bom ON SD.StockCode=Bom.ParentPart
    JOIN       Inv On BS.Component=Inv.StockCode
    WHERE      SD.SalesOrder=xxxxx
    AND        Inv.ProductClass='FG'

我现在遇到的问题是,一些返回的组件部分也可能在Bom表中包含一个条目作为父部件。因此,我需要返回所有带有' FG'初始父部件下的类,每个部件具有适当的总数量。这可能不会返回任何结果,但同时可以返回1到4个子查询层。

示例数据

INV

  • 第1部分,' FG'
  • 第2部分,' RM'
  • 第3部分,' RM'
  • 第4部分,' FG'
  • 第5部分,' RM'
  • 第6部分,' FG'
  • 第7部分,' RM'
  • 第8部分,' RM'
  • 第9部分,' FG'
  • 第10部分,' RM'
  • Part11,' FG'
  • Part12,' FG'

的Bom

  • 第1部分,第2部分,第1部分
  • Part1,Part3,1
  • Part1,Part4,1
  • Part4,Part5,2
  • Part1,Part6,2
  • Part6,Part7,1
  • Part6,Part8,1
  • Part6,Part9,3
  • Part9,Part10,1
  • Part9,Part11,1
  • Part11,Part12,1

根据这些数据,处理2" Part1"应该返回以下

结果

  • 1,Part1,2,Part4,dd / mm / yy
  • 1,Part1,4,Part6,dd / mm / yy
  • 1,Part6,12,Part9,dd / mm / yy
  • 1,Part9,12,Part11,dd / mm / yy

1 个答案:

答案 0 :(得分:1)

我希望这会对你有所帮助:

;WITH cte AS (
SELECT  CAST(NULL as nvarchar(6)) as Parent,
        StockCode as Child,
        ProductClass
FROM Inv 
WHERE StockCode = 'Part1'
UNION ALL
SELECT  b.ParentPart,
        b.Component,
        i.ProductClass
FROM Bom b
INNER JOIN cte c
    ON c.Child = b.ParentPart
INNER JOIN Inv i
    ON i.StockCode = b.Component AND i.ProductClass = c.ProductClass
)

SELECT  *
FROM cte
WHERE Parent IS NOT NULL

输出:

Parent  Child   ProductClass
Part1   Part4   FG
Part1   Part6   FG
Part6   Part9   FG
Part9   Part11  FG
Part11  Part12  FG

您可以从CTE中删除WHERE语句以获取所有层次结构。并将此CTE与另一张表联系起来。