1

我正在使用 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

前 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
4

1 回答 1

3

你的两个记录都有B.marketGroupID = 9

但你的eve.dbo.invLineage桌子只有marketGroupID IN (605, 126, 209, 604)

因此,简而言之,您不会得到任何记录,因为ON B.marketGroupID=P.marketGroupID从未找到任何匹配项。

于 2012-04-20T14:06:55.400 回答