powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение merge при добавлении order by
9 сообщений из 9, страница 1 из 1
Странное поведение merge при добавлении order by
    #40088589
stil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
merge into ais_dst dst
using (select * from ais_src order by value1 desc) src
on (dst.key1=src.key1)
when matched then 
  update set dst.value1 = src.value1,
             dst.value2 = src.value2 
when not matched then
  insert values (src.key1, src.value1, src.value2);

ORA-30926: невозможно получить устойчивый набор строк в исходных таблицах


Но

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
merge into ais_dst dst
using (select * from ais_src) src
on (dst.key1=src.key1)
when matched then 
  update set dst.value1 = src.value1,
             dst.value2 = src.value2 
when not matched then
  insert values (src.key1, src.value1, src.value2);

3 rows merged.



В ais_src поле key1 дублируется - я это знаю. Мне больше непонятно почему неупорядоченный набор вставляется без ошибки?

v12
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088590
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stil
В ais_src поле key1 дублируется - я это знаю. Мне больше непонятно почему неупорядоченный набор вставляется без ошибки?
Может вместо поисков ответа на этот вопрос лучше обеспечить детерминизм?
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088598
stil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
stil
В ais_src поле key1 дублируется - я это знаю. Мне больше непонятно почему неупорядоченный набор вставляется без ошибки?
Может вместо поисков ответа на этот вопрос лучше обеспечить детерминизм?


Безусловно в конечном варианте кода обеспечу

Данное поведение увидел случайно - и стало интересно - ПОЧЕМУ. В ПРОД это естественно не пойдет
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088603
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
stil
В ais_src поле key1 дублируется - я это знаю. Мне больше непонятно почему неупорядоченный набор вставляется без ошибки?
Может вместо поисков ответа на этот вопрос лучше обеспечить детерминизм?



order by value1,rowid обеспечивает детерминизм?

.....
stax
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088625
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
order by value1,rowid обеспечивает детерминизм?
Нет.
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088655
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stil

Данное поведение увидел случайно - и стало интересно - ПОЧЕМУ

Сам не сталкивался, поискал в гугле

где-то-в-интернет...
если новые значения и старые значения в обновленных столбцах совпадают, Oracle может пропустить эту проблему дубликатов
...
Но если старые и новые значения отличаются, Oracle вызывает исключение, которое вы получаете
...
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088689
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stil,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SQL> create table t1(key, value)
  2  as select 1, 0 from dual
  3  union all select 1, 1 from dual;

Table created.

SQL> create table t2(key, value)
  2  as select 1, 0 from dual;

Table created.

SQL> merge into t2 dst
  2  using (select * from t1 order by value desc) src
  3  on (dst.key=src.key)
  4  when matched then update set dst.value = src.value;
merge into t2 dst
           *
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables


SQL> merge into t2 dst
  2  using (select * from t1) src
  3  on (dst.key=src.key)
  4  when matched then update set dst.value = src.value;

2 rows merged.
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088697
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег,

грубо говоря ORA-30926 не зависит от наличия/отсутствия order by

как карта (даные) ляжет, повезло/не повезло

.....
stax
...
Рейтинг: 0 / 0
Странное поведение merge при добавлении order by
    #40088710
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Если очень хочется делать из своего кода минное поле и проигнорировать в using те строки, что есть в приёнике, то этого можно добиться сортировкой и дополнительным соединением.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> create table t1(key, value)
  2  as select 1, 0 from dual
  3  union all select 1, 1 from dual
  4  union all select 1, 0 from dual;

Table created.

SQL> create table t2(key, value)
  2  as select 1, 0 from dual;

Table created.

SQL> merge into t2 dst
  2  using (select * from t1 order by value desc) src
  3  on (dst.key=src.key)
  4  when matched then update set dst.value = src.value;
merge into t2 dst
           *
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables


SQL> merge into t2 dst
  2  using (select t1.* from t1, t2 where t1.key=t2.key order by nullif(t1.value, t2.value) desc) src
  3  on (dst.key=src.key)
  4  when matched then update set dst.value = src.value;

3 rows merged.



Сие тоже будет работать только если есть не более одной строки с новым значением обновляемого поля.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение merge при добавлении order by
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]