我有一个类似这样的表格:
Item
{
int ItemID
int ParentID
string Name
}
“Item”实际上是较大的“Object”表中的一个子集:
Object
{
int ObjectID
string Color
}
所以,
ItemID
是指向 ObjectID
的外键。在 Item
中,ParentID
可以引用另一个 Item 或父对象。我想做的是能够从 Item 关系中的叶子迭代到其所有父级,直到最终确定给定 Item 叶子所属的
ObjectID
。我想在 SQL 中完成这个操作。我正在使用 SQL Server 2008。
我的想法是:只需通过 Item 的
ParentID
向上迭代,直到无法将 ParentID
与另一个 Item 连接起来为止。这个 ParentID
就是我要返回的 ObjectID
。我一直在尝试使用内部连接来实现这一点,但没有成功。如果可以使用 LINQ 进行操作,那就更好了,但我不认为它会高效。
我选择的答案是:
WITH ObjectH (ParentID, ItemID, Level) AS
(
-- Base case
SELECT
ParentID,
ItemID,
1 as Level
FROM Item
WHERE ItemID = @param
UNION ALL
-- Recursive step
SELECT
i.ParentID,
i.ItemID,
oh.Level + 1 AS Level
FROM Item i
INNER JOIN ObjectH oh ON
c.ItemID = oh.ParentID
)
SELECT TOP 1 ParentID
FROM ObjectH
ORDER BY Level DESC
这个有效。