2014-01-29 4 views
0

Я работаю над отчетом, который находится в pic basic (yippee) и преобразует его в .NET. В конце отчет выглядит ниже. Таблица (только показывающая часть данных, чтобы она была простой) имела в ней ParentID (ID) и ChildID и в основном соединяется до тех пор, пока не будет доступным ChildID (NULL). Я написал процедуру, которая, как я думал, будет работать нормально, но сидит и не возвращает никаких результатов. SQL не моя сильная сторона.Иерархическая структура продукта

Report

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? Попробуйте выделить от «BEGIN» до «END», а затем нажмите F5. (как в стороне, у вас нет «END» в примере выше)

+0

Да, я пробовал это, и он медленно растет и работает вечно. Я, наконец, убил его через 45 минут. В таблице содержится около 580 000 записей, что не имеет большого значения, но не ужасно мало. И данные, которые он возвращает прямо сейчас, неверны, потому что он возвращает кратность в подразделении родителя. – user3249420

+0

Ваш образец таблицы имеет повторяющиеся значения для ParentID. Кроме того, Left Joins и Unions являются склонными к дублированию. Попробуйте удалить эти штуки по одному и посмотреть, когда удалены дублирующиеся результаты. – PCSgtL

+0

Я отдам его. Начальный уровень (@Parent = 'SA33028') будет иметь несколько родительских идентификаторов, потому что у них разные дети. Я буду искать конкретный исходный идентификатор родительского элемента, а затем разветвиться оттуда. Мне может понадобиться сделать последовательность циклов, чтобы как-то все получить. – user3249420

Смежные вопросы