我正在使用SQL Server 2008.这是我正在尝试做的事情。我有一个包含marketgroupID和parentID的表。每个市场组都有一个名称。我想创建这些名称的层次结构路径。
我尝试使用WITH anchor_statement recursive_statement选择CTE解决方案。它不起作用。
我找到了另一种创建新表的解决方案,并迭代填写值。它不是最高效的,它复制了大量的数据和列,但我并不在乎,因为它在一个相对较小的数据库上或多或少是一次性进程。我只是在寻找一个简单的解决方案(就像我猜的每个人一样)
基本上,我成功创建了表并在其中复制了一些值。
--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
这是我在这个阶段得到的结果的例子:
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。对不起这里糟糕的展示,我还在学习论坛。
现在,我想更新Lineage表的每一行的parentNode。
此信息是marketGroup表中的一列。
这是我写的请求,但返回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
前两个内连接似乎工作正常,但最后一个使它返回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 :(得分:3)
您的记录都有B.marketGroupID = 9
。
但您的eve.dbo.invLineage
表格只有marketGroupID IN (605, 126, 209, 604)
因此,简而言之,您没有记录,因为ON B.marketGroupID=P.marketGroupID
永远找不到任何匹配。