我有四个表:map,project,test,instance。 实例与测试相关联,测试与项目相关联。 三个表:project,test和instance都有一个map_id列(可以为null)。
我想更新一个'实例'带有map_id的条目。这个map_id应该首先来自test的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
答案 0 :(得分:1)
您可以在SQL中使用if-else staments,例如http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html(MsSQL和Oracle可能略有不同) 另一方面,这可能会使您的代码难以调试。
答案 1 :(得分:1)
您可以使用join和ifnull
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);
最终添加过滤的位置
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;