2010-12-16 5 views
0

チェーンの最初の要素(2)を入力データとして与える、またはそのいずれかの結果セットを得るために、どのようなSQLクエリを実行する必要がありますか?結果セットを取得するためにどのような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

どのデータベースおよびバージョン、あなたの結果を得るために働く必要がありますか? –

+0

私は、返される可能性のある固定数のレコードがないと仮定しています。そのため、結合のリストは問題ありません(ツリーをたどる)。しかし、何がリストの終わりを示していますか? ( 'new_record_id'に交配する' old_record_id'がないのでしょうか?) –

答えて

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

関連する問題