2014-01-29 185 views
0

我正在研究pic基本(yippee)并将其转换为.NET的报告。最终报告如下。该表(仅显示一部分数据以保持简单)具有ParentID(ID)和其中的ChildID,并基本上连接到没有可用的ChildID(NULL)。我写了一个我认为可以正常运行的程序,但坐着并没有返回任何类型的结果。 SQL不是我的强项。分层产品结构

报告

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 

SQL过程:

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; 
+0

SQL语句的结果需要看起来像为了生成报告吗? – eoldre

+0

像例子中的初始报告一样。哪里有0-x#级。 – user3249420

回答

0

在KISS原则的荣誉,我应问。你如何测试程序?你只是打了F5或从SQL内部运行它?尝试突出显示从“开始”到您的“结束”,然后击中F5。 (另外,上面的示例中没有“END”)

+0

是的,我试过了,它会慢慢长大并永远运行。 45分钟后我终于杀死了。这张桌子里有大约580,000条记录,我的意思并不大,但也不算很糟糕。而且它现在正在返回的数据是不正确的,因为它正在给予关联部门的倍数。 – user3249420

+0

您的表格样本具有ParentID的重复值。此外,左连接和联合都易于导致重复。尝试逐个删除这些作品,并查看重复结果何时删除。 – PCSgtL

+0

我会给它一个。起始级别(@Parent ='SA33​​028')将具有多个parentID,因为它们具有不同的子级。我将搜索一个特定的起始parentID,然后从那里分支出去。我可能最终不得不做一个循环序列来以某种方式得到一切。 – user3249420