Я использую 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
Есть ли какие-либо строки в таблице 'invMarketGroups' с соответствующим идентификатором marketGroupID? – Paddy
Если вы делаете SELECT в первых двух входящих в нее соединениях, что вы получаете? Можете ли вы показать нам данные? Для меня простой ответ: 'Нет B.marketGroupID, который соответствует любому из вашего P.marketGroupID' ... – MatBailie
Я верю, что да. я мог бы показать вам некоторые результаты. – darthun08