Используя подзапрос вместо имени таблицы в Операторе Обновления Oracle

Столкнулся с той же проблемой и смог разобраться, написав несколько строк с помощью aws-cdk, чтобы сгенерировать шаблон шаблона фильтра, чтобы увидеть разницу между этим и тем, что у меня было.

Похоже, что ему нужен каждый критерий, заключенный в круглые скобки.

- FilterPattern: '{ $.priority = "ERROR" && $.message != "*SomeMessagePattern*" }'
+ FilterPattern: '{ ($.priority = "ERROR") && ($.message != "*SomeMessagePattern*") }'

К сожалению, документы AWS для MetricFilter в CloudFormation не содержат примеров шаблонов JSON.

13
задан NateSchneider 23 October 2008 в 15:30
поделиться

5 ответов

Другая опция:

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

(Заявленным я подразумеваю, что ограничение существует и включено).

8
ответ дан 1 December 2019 в 22:40
поделиться

Я нахожу, что хороший, быстрый, последовательный способ превратить оператор 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')
    )

Так, Ваш внутренний запрос определяет строки для обновления.

7
ответ дан 1 December 2019 в 22:40
поделиться

Синтаксис Вашего примера прекрасен, но 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'
                      );
3
ответ дан 1 December 2019 в 22:40
поделиться

При выполнении обновления, можно очевидно только сказать системе обновлять значение к единственному новому значению - сообщение, это для обновления "X" и к "Y" и к "Z" не имеет смысла. Так, когда Вы базируетесь, обновление на результате встроенного представления Oracle выполняет проверку, что там существуют достаточные ограничения для предотвращения измененного столбца, потенциально обновляемого дважды.

В Вашем случае я ожидаю это TABLE2. PK не является на самом деле заявленным первичным ключом. Если бы Вы помещаете основное или ограничение на уникальность данных, на котором columnthen Вы были бы хороши для движения.

Существует недокументированная подсказка к byass проверка кардинальности соединения обновления, используемая внутренне Oracle, но я не советовал бы использовать его.

Одно обходное решение для этого должно использовать оператор MERGE, который не подвергается тому же тесту.

2
ответ дан 1 December 2019 в 22:40
поделиться

Каждая строка в наборе результатов запроса в Вашем пункте ОБНОВЛЕНИЯ должна отобразиться назад на одну и только одну строку в таблице, которую Вы пытаетесь обновить, и способом за которым Oracle может следовать автоматически. Так как запрос является действительно представлением, один способ думать об этом состоит в том, что Oracle должна смочь соединить представление назад с целевой таблицей для знания что строку обновить.

Это по существу означает, что необходимо включать первичный ключ конечной таблицы в том запросе. Вы смогли использовать некоторое другое поле (поля) уникального индекса также, но я не могу гарантировать, что DBMS Oracle достаточно умен для разрешения этого.

0
ответ дан 1 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: