2012-08-01 24 views
1

T-SQL樹搜索T-SQL樹搜索選擇的節點集合,如果他們是父母

下選擇從組節點,如果他們是父母

下,我有一個非常大的樹一個MSSQL Db(80000+)記錄。我的客戶請求通過文本LIKE命令快速搜索樹。 LIKE命令返回< 500條記錄。

是否有一些遞歸命令會檢查每個樹的快速查看它們是否在特定節點下?

編輯: 我認爲這是相當但明確....

我的SQL Server 2005年

Table Schema 
- (pK) Id 
- (fK) ParentId 
- FirstName 
- LastName 

我有遞歸調用是能夠迅速往下走幾個層次。但是要做名稱搜索,我將不得不輪詢可以達到幾百級深度的整個樹,而不是一個選項。我希望能夠幫助設計一個查詢,以便我可以首先搜索整個表以進行名稱匹配,並過濾不屬於問題樹的記錄。

+1

請告訴我們你的表模式,您所使用的數據庫引擎和版本(DB2,SQL服務器?)。因爲它是,你的問題可能會被視爲「不是一個真正的問題」 – Lamak 2012-08-01 15:06:54

回答

2

你可以用遞歸CTE來做到這一點 - 你需要一個代碼示例嗎?

這樣的(此代碼測試)

WITH recurseTree AS 
(
    SELECT * 
    FROM tableName 
    WHERE Id = @parentID 
    UNION ALL 
    SELECT c.* 
    FROM tableName c 
    JOIN recurseTree p ON c.parentID = p.id 
) 
SELECT * 
FROM recurseTree 

注:更多recient版本(2008+)給你做快速樹遍歷一個特殊的數據類型(hierarchyid)。這可能是最好的方式,其他任何事情都不會那麼快。升級!!

+0

這將是偉大的。我們一直在試圖編寫它,但尚未完全正確。 – 2012-08-01 15:23:39

+0

您不能從子查詢中進行遞歸調用,至少不能在SQL Server 2005中進行遞歸調用。不確定更高版本。 – 2012-08-01 15:30:18

+0

我在談論如果你嘗試運行這個查詢,SQL Server會給你以下錯誤:'子查詢中不允許遞歸引用。' – 2012-08-01 15:35:56

1

這會幫助你:

;WITH CTE AS 
(
    SELECT Id, ParentId, FirstName, LastName 
    FROM YourTable 
    UNION ALL 
    SELECT B.Id, B.ParentId, B.FirstName, B.LastName 
    FROM CTE A 
    INNER JOIN YourTable B 
    ON A.ParentId = B.Id 
) 
SELECT * 
FROM CTE 
WHERE FirstName LIKE '%something%' 
OPTION(MAXRECURSION 0) 
+0

我有這個,但是在這段代碼中你收集了幾千條記錄(問題節點下的整個子樹)然後過濾它。如果我們可以換一種方式,確定一個集合中的哪些節點在父節點下面,它可能會更快。 – 2012-08-01 17:02:01