Sql server 分层产品结构
我正在写一份在PICBasicyIPee中的报告,并将其转换为.NET。报告的结尾如下。仅显示一部分数据以保持简单的表中有parentId和ChildID,并且基本上连接,直到没有可用的ChildID为止。我写了一个程序,我认为它可以运行得很好,但它是静态的,不会返回任何类型的结果。SQL不是我的强项 报告 表: SQL过程:Sql server 分层产品结构,sql-server,tsql,Sql Server,Tsql,我正在写一份在PICBasicyIPee中的报告,并将其转换为.NET。报告的结尾如下。仅显示一部分数据以保持简单的表中有parentId和ChildID,并且基本上连接,直到没有可用的ChildID为止。我写了一个程序,我认为它可以运行得很好,但它是静态的,不会返回任何类型的结果。SQL不是我的强项 报告 表: SQL过程: 为了尊重亲吻原则,我会问。你是如何测试程序的?您是直接点击F5还是从SQL中运行它?尝试从开始到结束高亮显示,然后点击F5。顺便说一句,上面的示例没有结尾为了生成报告,S
为了尊重亲吻原则,我会问。你是如何测试程序的?您是直接点击F5还是从SQL中运行它?尝试从开始到结束高亮显示,然后点击F5。顺便说一句,上面的示例没有结尾为了生成报告,SQL语句的结果需要是什么样的?如示例中的初始报告。是的,我试过了,它慢慢长大,永远运行。45分钟后我终于杀了它。这个表中有大约580000条记录,这并不算大,但也不算小。而且它现在返回的数据不正确,因为它在parentid部门返回了多个值。您的表示例的parentid值确实重复。此外,左联接和联合都容易导致重复。试着一次删除一个,看看重复的结果何时被删除。我会试试看。起点level@Parent='SA33028'将具有多个parentID,因为它们具有不同的子级。我将搜索一个特定的起始parentID,然后从那里分支出来。我可能最终不得不做一个循环序列来获得所有东西。我不认为这样做可以达到这么多级别。在上面的示例中,这个层次结构可以是9层5,而在您显示的示例报告中,第一列代表什么?
0......... SA33028
1........ 42S0131
1........ 5S0127
1........ 6S0175
1........ SA33023
2....... 16S0142
2....... 18S0103
2....... 24S0108
2....... 28SM0105
2....... S30461.AI
2....... S30463
3...... S28807
3...... S28807
2....... S30641
2....... S31134
2....... S9383
2....... SA29801
3...... 16S0116
3...... S27798
3...... S31170
3...... SA30059
4..... 38S0116
4..... 7S0105
4..... S19430.145
5.... 7SM0145
6... 7SM0145.001
6... 7SM0145.002
5.... S19430
4..... S19431
2....... SA30910
ParentID ChildID
SA33028 42S0131
SA33028 5S0127
SA33028 6S0175
SA33028 79S0101
SA33028 S11870
SA33028 S30151
SA33028 SA33023
SA33028 SA33029
SA33023 S30463
S30463 S28807
ALTER PROCEDURE [dbo].[getHierarchy]
@Parent VARCHAR(20)
AS
BEGIN
SET NOCOUNT ON;
WITH AllParts([PSNbr], [ChildID], [ParentID])
AS
(
SELECT Child.Parent_Part AS PSNbr,
Child.Parent_Part AS ChildID,
Parent.Parent_Part AS ParentID
FROM ps AS Child
LEFT OUTER JOIN ps AS Parent
ON Child.Component_Part = Parent.Parent_Part
UNION ALL
SELECT AllParts.PSNbr AS PSNbr,
AllParts.ParentID AS ChildID,
NewParent.Component_Part AS ParentID
FROM AllParts
INNER JOIN PS AS NewParent
ON AllParts.ParentID = NewParent.Parent_Part
AND AllParts.ParentID <> AllParts.ChildID
INNER JOIN PS as NewParentInfo
ON NewParent.Component_Part = NewParentInfo.Parent_Part
)
SELECT AllParts.[PSNbr],
AllParts.[ParentID]
FROM AllParts
WHERE PSNbr = @Parent;