2016-08-25 10 views
1

私は4つのテーブルを持っています:map、project、test、instance。 インスタンスはテストに関連付けられ、テストはプロジェクトに関連付けられます。 3つのテーブル:project、test、およびinstanceにはすべてmap_idカラムがあります(nullでもかまいません)。3つのテーブルの1つから値を選択

「instance」エントリをmap_idで更新したいとします。このmap_idは、最初にテストのmap_idから取得する必要があります。 nullの場合は、プロジェクトのmap_idを使用します。

私はコードと複数のSQLクエリでこれを行うことができます。単一の更新クエリでこれを行う方法はありますか?

もしそうでなければ、おそらく私はこれを新しい入力トリガーで行いますが、後で単一の更新クエリでこれを行うことをお勧めします。

スキーマ:

map 
+map_id 

project 
+project_id 
+map_id 

test 
+test_id 
+project_id 
+map_id 

instance 
+instance_id 
+test_id 
+map_id 

答えて

1

あなたは

update instance 
inner join test on instance.test_id = test.test_id 
inner join project on test.project_id = project.project_id 
set instance.map_id = ifnull(test.map_id, project.map_id) 
where instance.instance_id = your_value; 
をフィルタリングするための場所を追加結合を使用し、最終的に

update instance 
inner join test on instance.test_id = test.test_id 
inner join project on test.project_id = project.project_id 
set instance.map_id = ifnull(test.map_id, project.map_id); 

をIFNULLすることができます

1

あなたは、これはデバッグに本当にハード、あなたのコードを作ることができる一方 (Microsoft SQLおよびOracleは多少異なる場合があります)たとえばhttp://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.htmlのために、あなたのSQL内側のif-else stamentsを使用することができます。

関連する問題