2010-12-16 52 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

相关问题