Обновление таблицы с использованием ошибки объединения в oracle [duplicate]

В вопросе может быть неоднозначным, что подразумевается под «последним».

, например git log --graph выводит следующее (упрощенное):

* commit H0
|
* merge
|\
| * commit B0
| |
| * commit B1
| | 
* | commit H1
| |
* | commit H2
|/
|

. Затем последние фиксируются по времени: H0, merge, B0.

Проблема заключается в том, что H0 содержит H1 и H2 (и, как правило, больше коммитов перед слиянием и после ветвления), а B0 - нет. Таким образом, вам нужно управлять изменениями от H0, merge, H1, H2, B0 по крайней мере.

Можно использовать rebase, но по-другому, а затем в других упомянутых ответах:

rebase -i HEAD~2

Это покажет вам варианты выбора (как упоминалось в других ответах):

pick B1
pick B0
pick H0

Поместите сквош вместо выбора в H0:

pick B1
pick B0
s H0

После сохранения и выключения rebase будет применяться фиксация по очереди после H1. Это означает, что он попросит вас снова разрешить конфликты (где HEAD будет сначала H1, а затем накапливает фиксации по мере их применения).

После того, как rebase завершится, вы можете выбрать сообщение для раздавленных H0 и B0:

* commit squashed H0 and B0
|
* commit B1
| 
* commit H1
|
* commit H2
|

PS Если вы просто выполните сброс в BO: (например, используя reset --mixed, который более подробно объясняется здесь https://stackoverflow.com/a/18690845/2405850 ):

git reset --mixed hash_of_commit_B0
git add .
git commit -m 'some commit message'

, тогда вы раздавите в B0 изменения H0, H1, H2 (потеря полностью фиксирует изменения после разветвления и перед слиянием.

11
задан Jim Kiley 17 February 2012 в 23:17
поделиться

3 ответа

Вы должны сделать это с помощью коррелированного подзапроса

UPDATE tbl1 t1
   SET t1.b = (SELECT c
                 FROM tbl2 t2
                WHERE t1.id = t2.id
                  AND t1.a  = t2.a
                  AND t1.b  = t2.b
                  AND t2.d  = 'a')
 WHERE t1.a = 'foo'
   AND EXISTS( SELECT 1
                 FROM tbl2 t2
                WHERE t1.id = t2.id
                  AND t1.a  = t2.a
                  AND t1.b  = t2.b
                  AND t2.d  = 'a')

. Проблема с написанным вами UPDATE заключается в том, что Oracle не может гарантировать, что существует ровно 1 tbl2.c значение что соответствует одному значению tbl1.b. Если в tbl2 для каждой конкретной строки в tbl1 имеется несколько строк, коррелированное обновление будет вызывать ошибку, указывающую на то, что подстрочный ряд с одной строкой возвратил несколько строк. В этом случае вам нужно добавить некоторую логику в подзапрос, чтобы указать, какую строку из tbl2 использовать в этом случае.

20
ответ дан Justin Cave 24 August 2018 в 09:42
поделиться

Кажется, что ваше представление не является сохранением ключа в соответствии с ( http://www.orafaq.com/tuningguide/updateable%20view.html ). Действительно, вы делаете свое соединение не на первичный ключ, который, кажется, не разрешен.

0
ответ дан Abbadon 24 August 2018 в 09:42
поделиться

Этот оператор терпит неудачу с ошибкой (ORA-01779 не может изменить столбец, который сопоставляется с таблицей, не сохраненной ключом), поскольку он пытается изменить базовую таблицу tbl1table, а таблица tbl1 не сохраняет ключ в представлении. потому что хотя (ID, A) является ключом таблицы dept, это не является ключом соединения.

1
ответ дан Bhargav Rao 24 August 2018 в 09:42
поделиться
Другие вопросы по тегам:

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