【问题标题】:Sql serverrRecursive query for BOM not showing child partsBOM的Sql serverr递归查询不显示子部件
【发布时间】:2014-11-19 13:53:19
【问题描述】:

我有三张桌子:

  1. SO_Items 销售订单 - SOCTE 列出所有具有实时销售订单的零件
  2. 组件 - 将一个部件与其组件连接起来(这可以是几层深)。 CR 使用递归列出所有部分及其组件。
  3. WO 工作订单 - WOCTE 列出所有具有有效销售订单的零件及其各自的工作订单。

我遇到的问题是:

我有一个零件 100831 的销售订单,它是由 100831-U 制成的。 我有一个 10 号 100831 和 11 号 100831-U 的工单。

我的查询结果是:

Part     WO
100831   10
100831-U 11

这是正确的。

但我希望它是

Part   WO
100831 10
100831 11

我只想要列出销售订单的零件及其所有及其组件的工作订单。 我尝试过使用变量,但似乎无法正确使用。

任何帮助将不胜感激

我创建了一个 SQL 小提琴 http://sqlfiddle.com/#!3/c77a5/1

当前输出为:

|      PART | WO |
|-----------|----|
|    100831 | 10 |
|  100831-U | 11 |
|    106061 | 12 |
|     43567 | 15 |
| R106061-1 | 13 |
| R106061-1 | 14 |

我正在尝试仅获取 SO_Items(销售订单)中的零件以及其 BOM 中的所有 WO_No(工作订单号)。 (材料清单)

|      PART | WO |
|-----------|----|
|    100831 | 10 |
|    100831 | 11 |
|    106061 | 12 |
|     43567 | 15 |
|    106061 | 13 |
|    106061 | 14 |

WITH SOCTE (Part) as
(
SELECT DISTINCT SO_Items.Part_No
FROM  SO_Items
WHERE (SO_Items.Fully_Del='N') 
),

CR (Part,Component) as
(
SELECT  SOCTE.Part , Components.Component_Part_No 
FROM Components
JOIN SOCTE 
ON Components.Parent_Part_No = SOCTE.Part
UNION ALL
SELECT Parent_Part_No,Component_Part_No 
FROM Components
INNER JOIN CR AS SCR ON SCR.Component = Components.Parent_Part_No
),

WOCTE(Part,WO) as 
(
Select  Distinct Part ,WO.WO_No
FROM  WO 
Inner JOIN CR 
ON CR.Part=WO.Part_No and WO.WO_Complete=0 and   WO.ReProcess=0
)
SELECT Part,WO FROM WOCTE
Order by Part

【问题讨论】:

  • 您只想去掉Part 字段中破折号后的所有内容?为什么不LEFT(Part,CHARINDEX('-',Part)-1)
  • 这是一个例子。部件的组成部分可以是任何其他部件。
  • 那么您不希望WOCTE 选择CR.Component 来代替CR.Part 或在CR.Part 之外选择吗?或者可能是SELECT CR.Part, WO.WO_No ... UNION SELECT CR.Component, WO.WO_No ...?如果“我只想要列出销售订单的零件及其所有及其组件的工作订单”会有所帮助。是一个完整而具体的句子。
  • 你说得对,我需要 select CR.Part, WO.WO_NO ... Union select CR.Component,Wo_Wo_No 从零件及其所有组件中获取所有工作订单。然而,层次结构中的最后一部分始终是原材料,永远不会有工作订单 (WO.WO_No)。
  • WO RIGHT JOIN CR in WOCTE?

标签: sql sql-server recursive-query


【解决方案1】:

好的,你更新的解释很有帮助。

我想我有它:

;WITH SOCTE (Part) as (
    SELECT DISTINCT SO_Items.Part_No
    FROM  SO_Items
    WHERE (SO_Items.Fully_Del = 'N') 
),
CR (Part, SO_Part, Component, Step) as (
    SELECT SOCTE.Part, SOCTE.Part AS "SO_Part", Components.Component_Part_No, 0
    FROM Components
    JOIN SOCTE 
        ON Components.Parent_Part_No = SOCTE.Part

    UNION ALL

    SELECT Components.Parent_Part_No, SCR.SO_Part, Components.Component_Part_No, SCR.Step + 1
    FROM Components
    INNER JOIN CR AS SCR 
        ON SCR.Component = Components.Parent_Part_No
),
WOCTE (Part, WO) as (
    SELECT DISTINCT CR.SO_Part, WO.WO_No
    FROM WO 
    INNER JOIN CR 
        ON  CR.Part        = WO.Part_No 
        AND WO.WO_Complete = 0
        AND WO.ReProcess   = 0
)
SELECT *
FROM WOCTE
ORDER BY Part

这并不完美,我还有额外的字段。我决定如果你不能让一个领域做两件事,那么也许应该有第二个领域。 Step 字段只是为了查看 CTE 是如何递归的。将SELECT * FROM CR 与步骤编号一起使用有助于查看字段的去向以及我需要保留的内容。

【讨论】:

  • 谢谢 Bacon Bits,它运行良好。我正在兜圈子试图解决这个问题。
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2023-03-22
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2015-05-21
相关资源
最近更新 更多