【发布时间】:2014-11-19 13:53:19
【问题描述】:
我有三张桌子:
- SO_Items 销售订单 - SOCTE 列出所有具有实时销售订单的零件
- 组件 - 将一个部件与其组件连接起来(这可以是几层深)。 CR 使用递归列出所有部分及其组件。
- 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 CRinWOCTE?
标签: sql sql-server recursive-query