【发布时间】:2010-09-26 01:48:56
【问题描述】:
我有一张这样的桌子:
Item
{
int ItemID
int ParentID
string Name
}
Item 实际上是一个更大的表 Object 的子集:
Object
{
int ObjectID
string Color
}
所以ItemID 是ObjectID 的FK。在Item 中,ParentID 可以引用另一个 Item 或父 Object。
我想要做的是能够从 Item 关系中的叶子一直迭代到其父级,直到我最终可以确定给定 Item 叶子的 ObjectID 来自什么。
我想在 SQL 中执行此操作。我正在使用 SQL Server 2008。
这就是我的想法。我可以遍历 Item ParentID,直到我不能再将 ParentID 与另一个 Item 一起加入。这个ParentID是我要返回的ObjectID。
我一直在尝试使用内部连接来使其工作,但没有运气。我正在使用 C#,所以如果这可以在 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
这行得通。
【问题讨论】:
标签: c# sql sql-server linq