Столкнулся с той же проблемой и смог разобраться, написав несколько строк с помощью aws-cdk, чтобы сгенерировать шаблон шаблона фильтра, чтобы увидеть разницу между этим и тем, что у меня было.
Похоже, что ему нужен каждый критерий, заключенный в круглые скобки.
- FilterPattern: '{ $.priority = "ERROR" && $.message != "*SomeMessagePattern*" }'
+ FilterPattern: '{ ($.priority = "ERROR") && ($.message != "*SomeMessagePattern*") }'
К сожалению, документы AWS для MetricFilter в CloudFormation не содержат примеров шаблонов JSON.
Другая опция:
UPDATE TABLE1 a
SET a.COL1 = 'VALUE'
WHERE a.FK IN
( SELECT b.PK FROM TABLE2 b
WHERE b.COL2 IN ('SET OF VALUES')
)
Ваш второй пример работал бы, если бы (a) представление включал заявленный PK TABLE1:
UPDATE
(
SELECT
a.COL1, a.PKCOL
FROM
TABLE1 a,
TABLE2 b
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
) update_tbl
SET
update_tbl.COL1 = 'VALUE'
... и (b) TABLE1. FK был заявленным внешним ключом к TABLE2
(Заявленным я подразумеваю, что ограничение существует и включено).
Я нахожу, что хороший, быстрый, последовательный способ превратить оператор SELECT в ОБНОВЛЕНИЕ состоит в том, чтобы сделать обновление на основе ROWID.
UPDATE
TABLE1
SET
COL1 = 'VALUE'
WHERE
ROWID in
(
SELECT
a.rowid
FROM
TABLE1 a,
TABLE2 b
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
)
Так, Ваш внутренний запрос определяет строки для обновления.
Синтаксис Вашего примера прекрасен, но Oracle требует, чтобы подзапрос включал первичные ключи. Это - довольно значительное ограничение.
На связанной ноте можно также использовать круглые скобки для использования 2 или больше полей в операторе IN, как в:
UPDATE
TABLE1 update_tbl
SET
update_tbl.COL1 = 'VALUE'
WHERE
(update_tbl.PK1, update_tbl.pk2) in(
select some_field1, some_field2
from some_table st
where st.some_fields = 'some conditions'
);
При выполнении обновления, можно очевидно только сказать системе обновлять значение к единственному новому значению - сообщение, это для обновления "X" и к "Y" и к "Z" не имеет смысла. Так, когда Вы базируетесь, обновление на результате встроенного представления Oracle выполняет проверку, что там существуют достаточные ограничения для предотвращения измененного столбца, потенциально обновляемого дважды.
В Вашем случае я ожидаю это TABLE2. PK не является на самом деле заявленным первичным ключом. Если бы Вы помещаете основное или ограничение на уникальность данных, на котором columnthen Вы были бы хороши для движения.
Существует недокументированная подсказка к byass проверка кардинальности соединения обновления, используемая внутренне Oracle, но я не советовал бы использовать его.
Одно обходное решение для этого должно использовать оператор MERGE, который не подвергается тому же тесту.
Каждая строка в наборе результатов запроса в Вашем пункте ОБНОВЛЕНИЯ должна отобразиться назад на одну и только одну строку в таблице, которую Вы пытаетесь обновить, и способом за которым Oracle может следовать автоматически. Так как запрос является действительно представлением, один способ думать об этом состоит в том, что Oracle должна смочь соединить представление назад с целевой таблицей для знания что строку обновить.
Это по существу означает, что необходимо включать первичный ключ конечной таблицы в том запросе. Вы смогли использовать некоторое другое поле (поля) уникального индекса также, но я не могу гарантировать, что DBMS Oracle достаточно умен для разрешения этого.