2012-02-26 47 views
5

我不確定SQL Server數據庫中是否可以這樣做?我可以在T-SQL數據庫中執行遞歸SELECT操作嗎

說,我有一個表:

id INT 
nm NVARCHAR(256) 
cid INT --references [id] 

,並假設數據:

id nm  cid 
1 Name 1 0 
2 Name 2 0 
3 Name 3 1 
4 Name 4 3 
5 Name 5 2 
6 Name 6 4 
7 Name 7 2 

而且可供選擇的邏輯應該如下:

  1. 說,我們有原始編號,我們稱它爲N.

  2. 然後我們有一個查找ID,我們稱之爲X.然後我們做:

    SELECT [cid] FROM [TableName] WHERE [id]=X 
    

,並檢查結果是否等於N.如果是,那麼我們回到[納米]該記錄。如果結果爲0,那麼我們返回Null。如果結果是別的,我們做相同的選擇,除了X現在是結果值。

我明顯可以用C#做​​到這一點,但我很好奇,如果這樣可以包裝在一個純粹的SQL語句?

PS。只是爲了我的桌子上面說明了這一點,如果N是1,X是6,那麼我們得到:

SELECT [cid] FROM [TableName] WHERE [id]=6 --results is 4 (not N or 0, then continue) 
SELECT [cid] FROM [TableName] WHERE [id]=4 --results is 3 (not N or 0, then continue) 
SELECT [cid] FROM [TableName] WHERE [id]=3 --results is 1 (is N, then return "Name 1") 

,或者如果N是1,X是7,我們得到:

SELECT [cid] FROM [TableName] WHERE [id]=7 --results is 2 (not N or 0, then continue) 
SELECT [cid] FROM [TableName] WHERE [id]=2 --results is 0 (is 0, then return Null) 

編輯: 我需要這個在SQL Server 2008下運行。

+0

什麼是您的DBMS? SQL Server,Oracle或其他? – 2012-02-26 23:00:27

+1

哪個版本的SQL Server?這可以通過遞歸CTE(公用表表達式)來實現,但我不知道它們是否適用於您的版本。 – hvd 2012-02-26 23:00:32

+0

@ hvd我正在使用SQL Server 2008 – ahmd0 2012-02-26 23:01:40

回答

14

遞歸CTE可以做到這一點。它應該是這樣的:

WITH q AS (
    SELECT t.id, t.name, t.cid 
    FROM t 
    WHERE t.id = @x 
    UNION ALL 
    SELECT t.id, t.name, t.cid 
    FROM q 
    INNER JOIN t 
    ON t.id = q.cid 
) 
SELECT name 
FROM q 
WHERE id = @n 

的想法是,CTE可以引用自身在UNION ALL條款的第二部分,直到它不會產生更多的結果,或內部限制,將評估的第二部分到達了。

+0

非常好。我需要嘗試一下。謝謝。 – ahmd0 2012-02-26 23:32:34

相關問題