我有一個表是這樣的:SQL要獲取父從自參照表
Item
{
int ItemID
int ParentID
string Name
}
項目實際上是一個更大的表對象的一個子集:
Object
{
int ObjectID
string Color
}
所以ItemID
是一個FK到ObjectID
。在Item
之內,ParentID
可以引用另一個項目或父對象。
我想要做的就是能夠從項目關係中的葉子一直向上遍歷其父項,直到我終於可以確定給定的項目葉子從哪裏下降到ObjectID
。
我想在SQL中執行此操作。我正在使用SQL Server 2008.
這是我在想什麼。我可以迭代項目ParentID
,直到我不能再與其他項目加入ParentID
。這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
這工作。
該代碼起作用,因爲它列出了所有關係,但是如何選擇給定任何ItemID的ObjectID? – George 2010-09-26 03:56:15
它現在只是返回一個巨大的ParentID列表。我可以告訴查詢是在做什麼,所以我可能能夠從這裏開始工作。我不是SQL文盲,但我只是不夠好做遞歸的東西。感謝您的編輯! – George 2010-09-26 04:18:22
該列表包含多個Level = 1。它列出了每個可能的Level = 1。我一直在看,並據我所知可以工作。再次感謝 – George 2010-09-26 04:51:01