2016-08-25 6 views
1

У меня есть четыре таблицы: карта, проект, тест, экземпляр. Экземпляр связан с тестом, и тест связан с проектом. Три таблицы: проект, тест и экземпляр, все имеют столбец map_id (который может быть нулевым).Выбор значения из одной из трех таблиц

Я хочу обновить запись «instance» с помощью map_id. Этот map_id должен быть сначала получен из map_id test; если это 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

Вы можете использовать присоединиться и 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; 
1

Вы могли бы использовать, если-иначе staments внутри вашего SQL, например http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html (MsSQL и Oracle может немного отличаться) С другой стороны, это может сделать ваш код действительно трудно отлаживать.

Смежные вопросы