Почему этот запрос не обновляется? - PullRequest
0 голосов
/ 17 ноября 2018

Я хотел дать ответ на этот вопрос , в котором у ОП есть две таблицы:

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.

Что заставило меня спросить, почему этот запрос не обновляется?

1 Ответ

0 голосов
/ 17 ноября 2018

Вы присоединяетесь к запросу с агрегатом (Max).

Агрегаты не могут быть обновлены.В Access в запросе на обновление каждая часть запроса должна быть обновляемой (за исключением простых выражений и подзапросов в WHERE части вашего запроса), что означает, что ваш запрос не подлежит обновлению.

Вы можете обойти эту проблему, используя доменные агрегаты (DMin и DMax) вместо реальных, но этот запрос значительно снизит производительность.

Вы также можете обойти это,переписать ваши агрегаты, чтобы они выполнялись в предложении EXISTS или NOT EXISTS, поскольку это часть предложения WHERE, поэтому не требует обновления.Это, вероятно, минимально повлияет на производительность, но означает, что вам нужно разделить этот запрос на два: 1 запрос, чтобы все поля были «пропущены», которые удовлетворяли вашему условию, и другой, чтобы задать для них «сбой», если они этого не делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...