我应该执行什么SQL查询来获得预期的结果集,将链(2)的第一个元素作为输入数据或其中任何一个?
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|
+--+
我知道我应该考虑更改我的数据模型,但是:如果我不能做什么?
提前谢谢!
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:-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来强制执行此操作,并让您查看是否允许此操作。