2012-04-20 2 views
1

Я использую SQL Server 2008. Вот что я пытаюсь сделать. У меня есть таблица с marketgroupID и parentID. каждая рыночная группа имеет имя. Я хотел бы создать путь иерархии этих имен.Почему строка затрагивает 0 в этом запросе SQL Server?

Я попробовал решение CTE с помощью WITH anchor_statement recursive_statement, выберите. это не сработало.

Я нашел другое решение, в котором вы создаете новую таблицу, и введите значения итеративно. Это не самая результативная, она дублирует множество данных и столбцов, но мне все равно, потому что это более или менее одноразовый процесс в относительно небольшой базе данных. Я просто ищу простое решение (как и все, что я думаю)

В принципе, я успешно создал таблицу и скопировал некоторые значения внутри нее.

--Create Lineage Table 
Create Table Eve.dbo.invLineage(
Node int NOT NULL IDENTITY(100,1), 
typeID int, 
parentNode int, 
marketGroupName nvarchar(100), 
marketGroupID int, 
Depth tinyint, 
Lineage nvarchar(max) 
) 

и скопировал в него значения.

INSERT INTO EVE.dbo.invLineage (typeID,marketGroupID) 
SELECT [EVE].[dbo].invTypes.typeID,EVE.dbo.invTypes.marketGroupID 
FROM EVE.dbo.invTypes 
LEFT JOIN eve.dbo.invGroups ON EVE.dbo.invTypes.groupID= eve.dbo.invGroups.groupID 
WHERE eve.dbo.invGroups.categoryID=7 AND Eve.dbo.invTypes.published=1 

это Exemple результата я получаю на этом этапе:

Node typeID parentNode marketGroupName marketGroupID Depth Lineage 
100 377  NULL  NULL   605   NULL NULL 
101 380  NULL  NULL   605   NULL NULL 
102 393  NULL  NULL   126   NULL NULL 
103 394  NULL  NULL   126   NULL NULL 
104 399  NULL  NULL   609   NULL NULL 
105 400  NULL  NULL   609   NULL NULL 
106 405  NULL  NULL   604   NULL NULL 
107 406  NULL  NULL   604   NULL NULL 

Так мне удалось получить NodeId, а TypeID, и marketGroupID успешно. извините за плохой дисплей здесь, я все еще изучаю форумы.

Теперь я хотел бы обновить parentNode для каждой строки таблицы Lineage.

Эта информация является столбиком на рынкеГруппа.

Вот запрос, который я написал, но который возвращает 0 строк.

UPDATE T SET T.parentNode=P.Node 
FROM Eve.dbo.invLineage as T 
INNER JOIN eve.dbo.invMarketGroups E ON T.marketGroupID=E.marketGroupID 
INNER JOIN eve.dbo.invMarketGroups B ON E.parentGroupID=B.marketGroupID 
INNER JOIN Eve.dbo.invLineage P ON B.marketGroupID=P.marketGroupID 

Первые 2 внутренних соединения, похоже, работают нормально, но последний возвращает 0 строк.

Кроме того, я отслеживаю это руководство: http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

Вот некоторые результаты я получаю, если я запустить этот запрос на выборку для отладки цели:

SELECT * --SET T.parentNode=P.Node 
FROM Eve.dbo.invLineage as T 
INNER JOIN eve.dbo.invMarketGroups E ON T.marketGroupID=E.marketGroupID 
INNER JOIN eve.dbo.invMarketGroups B ON E.parentGroupID=B.marketGroupID 
--INNER JOIN eve.dbo.invLineage P ON B.marketGroupID=P.marketGroupID 

Node typeID parentNode marketGroupName marketGroupID Depth Lineage marketGroupID parentGroupID marketGroupName description iconID hasTypes marketGroupID parentGroupID marketGroupName description iconID hasTypes 
1134 10039 NULL NULL 760 NULL NULL 760 9 Civilian Modules Modules whose specifications are geared toward use on rookie ships. NULL 1 9 NULL Ship Equipment Everything the dedicated pilot needs to outfit their ship. 1432 0 
2913 21853 NULL NULL 760 NULL NULL 760 9 Civilian Modules Modules whose specifications are geared toward use on rookie ships. NULL 1 9 NULL Ship Equipment Everything the dedicated pilot needs to outfit their ship. 1432 0 
+0

Есть ли какие-либо строки в таблице 'invMarketGroups' с соответствующим идентификатором marketGroupID? – Paddy

+4

Если вы делаете SELECT в первых двух входящих в нее соединениях, что вы получаете? Можете ли вы показать нам данные? Для меня простой ответ: 'Нет B.marketGroupID, который соответствует любому из вашего P.marketGroupID' ... – MatBailie

+0

Я верю, что да. я мог бы показать вам некоторые результаты. – darthun08

ответ

3

Обе ваши записи имеют B.marketGroupID = 9.

Но ваша eve.dbo.invLineage таблица имеет только marketGroupID IN (605, 126, 209, 604)

Так, короче говоря, вы не получите никаких записей, потому что ON B.marketGroupID=P.marketGroupID никогда не находит никаких совпадений.

+0

, хотя я только показал 3 выложенных из многих, ваш комментарий по-прежнему верен. почему-то, когда я скопировал данные в таблицу, я слишком сильно ограничил свой поиск. – darthun08

+0

Я буду двигаться, изменяя MarketGroups напрямую. Спасибо. – darthun08

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