2010-12-16 53 views
0

我應該執行什麼樣的SQL查詢來獲得期望的結果集,並將鏈(2)的第一個元素作爲輸入數據或它們中的任何一個?我應該執行什麼SQL查詢來獲得預期的結果集?

table name: changes 
+----+---------------+---------------+ 
| id | new_record_id | old_record_id | 
+----+---------------+---------------+ 
| 1|    4|    2| 
|  -- non relevant data --  | 
| 6|    7|    4| 
|  -- non relevant data --  | 
| 11|    13|    7| 
| 12|    14|    13| 
|  -- non relevant data --  | 
| 31|    20|    14| 
+----+---------------+---------------+ 


Result set expected: 

+--+ 
| 2| 
| 4| 
| 7| 
|13| 
|14| 
|20| 
+--+ 

我知道我應該考慮改變我的數據模型,但是:如果我不能?

預先感謝您!

+1

什麼數據庫版本? – 2010-12-16 23:40:52

+0

我假定沒有可返回的固定數量的記錄,所以連接列表超出了問題的範圍(遍歷樹)。然而,什麼標誌着名單的結局呢? (是否'new_record_id'沒有匹配'old_record_id'?) – 2010-12-17 00:31:16

回答

1

下面的代碼應該工作,讓您的結果

CREATE TABLE #return(val int) 
DECLARE @VAL int 
SET @VAL = 2 

WHILE (SELECT count(*) FROM [changes] 
WHERE old_record_id = @VAL) > 0 
BEGIN 
INSERT INTO #return values(@VAL) 

SELECT @VAL = new_record_id FROM [changes] 
WHERE old_record_id = @VAL 
END 
INSERT INTO #return values(@VAL) 
SELECT * FROM #return 
-1

,如果你有在中間數據,你不想更新,那麼唯一的解決辦法是

update table set id=2 where id=4; 
update table set id=4 where id=7; 
update table set id=7 where id=13; 
update table set id=13 where id=14; 
update table set id=14 where id=20; 

但是,如果它在這一般會發生,他們出現的順序更新此更新可能會奏效如果你將表格的pk設置爲id。

update table set id=(select min(id) from table b where b.id>table.id) 

您還可以通過在結尾處加一個order by i d迫使這一點,讓你看看它是否允許。

1

既然你是在數據庫上含糊其辭,這裏是一些好的文學作品:

MySQL的

看看周圍部分7,這正好中的層次結構和遞歸函數
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html

MSSQL

關於同一事物的好文章(你會發現函數是普通的地方,儘管MSSQL可以使用WITH)。
http://www.sqlservercurry.com/2009/06/simple-family-tree-query-using.html

PostgreSQL的

同類型的文章。所有這些都有相同的前提,從孩子到父母的工作就像一個數據庫樹。
http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=24

相關問題