Я хотел дать ответ на этот вопрос , в котором у ОП есть две таблицы:
Table1
+--------+--------+
| testID | Status |
+--------+--------+
| 1 | |
| 2 | |
| 3 | |
+--------+--------+
Table2
+----+--------+--------+--------+
| ID | testID | stepID | status |
+----+--------+--------+--------+
| 1 | 1 | 1 | pass |
| 2 | 1 | 2 | fail |
| 3 | 1 | 3 | pass |
| 4 | 2 | 1 | pass |
| 5 | 2 | 2 | pass |
| 6 | 3 | 1 | fail |
+----+--------+--------+--------+
Здесь OP ожидает обновления поля status
для каждого testID
в Таблице 1 на pass
, если status
всех stepID
записей, связанных с testID
в Таблице 2, имеет status
из pass
, иначе таблица 1 должна быть обновлена с fail
для этого testID
.
В этом примере результат должен быть:
+--------+--------+
| testID | Status |
+--------+--------+
| 1 | fail |
| 2 | pass |
| 3 | fail |
+--------+--------+
Я написал следующий код SQL, пытаясь это сделать:
update Table1 a inner join
(
select
b.testID,
iif(min(b.status)=max(b.status) and min(b.status)='pass','pass','fail') as v
from Table2 b
group by b.testID
) c on a.testID = c.testID
set a.testStatus = c.v
Однако MS Access сообщает слишком знакомый ответ «операция должна использовать обновляемый запрос».
Я знаю, что запрос не может быть обновлен, если существует связь «один ко многим» между обновляемой записью и набором значений, но в этом случае агрегированный подзапрос будет давать отношение «один к одному» между два поля testID
.
Что заставило меня спросить, почему этот запрос не обновляется?