Sql server 分层产品结构

Sql server 分层产品结构,sql-server,tsql,Sql Server,Tsql,我正在写一份在PICBasicyIPee中的报告,并将其转换为.NET。报告的结尾如下。仅显示一部分数据以保持简单的表中有parentId和ChildID,并且基本上连接,直到没有可用的ChildID为止。我写了一个程序,我认为它可以运行得很好,但它是静态的,不会返回任何类型的结果。SQL不是我的强项 报告 表: SQL过程: 为了尊重亲吻原则,我会问。你是如何测试程序的?您是直接点击F5还是从SQL中运行它?尝试从开始到结束高亮显示,然后点击F5。顺便说一句,上面的示例没有结尾为了生成报告,S

我正在写一份在PICBasicyIPee中的报告,并将其转换为.NET。报告的结尾如下。仅显示一部分数据以保持简单的表中有parentId和ChildID,并且基本上连接,直到没有可用的ChildID为止。我写了一个程序,我认为它可以运行得很好,但它是静态的,不会返回任何类型的结果。SQL不是我的强项

报告

表:

SQL过程:


为了尊重亲吻原则,我会问。你是如何测试程序的?您是直接点击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;