我应该执行什么SQL查询来获得预期的结果集?

时间:2010-12-16 23:39:24

标签: sql mysql recursion

我应该执行什么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|
+--+

我知道我应该考虑更改我的数据模型,但是:如果我不能做什么?

提前谢谢!

3 个答案:

答案 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来强制执行此操作,并让您查看是否允许此操作。