powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
10 сообщений из 10, страница 1 из 1
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971788
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Есть две таблички, "источник" и "приёмник".
Допустим, в источнике есть _строго_ одна запись, ID которой нет в приёмнике:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
recreate table s(id int primary key,y int);  -- source
commit;
insert into s values(1, 200);
insert into s values(2, 400);
commit;

recreate table t(id int primary key,x int); -- target
commit;
insert into t values(1, 100);
commit;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from s;

     ID            Y
======= ============
      1          200
      2          400

select * from t;

     ID            X
======= ============
      1          100
Теперь пробуем сделать merge, но только с одним условием 'when NOT matched', и попросим его вернуть новые значения в полях таблицы-приёмника:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> merge into t using (select * from s where id>=2) s on s.id=t.id 
CON> when not matched then insert values(s.id, s.y) 
CON> returning new.id as new_t_id, new.x as new_t_x;

    NEW_T_ID      NEW_T_X
============ ============
           2          400

Источник внутри using'a, как видно, специально "причёсан" под наши знания о том ID'шнике, которого нет в`t`. Некрасиво.
Но если попробуем иначе, то получим шваброй:

Код: plaintext
1.
2.
3.
SQL> merge into t using s on s.id = t.id when not matched then insert values(s.id, s.y) returning new.id as new_t_id, new.x as new_t_x;

Statement failed, SQLSTATE = 21000
multiple rows in singleton select

В доке по 3.0 сказано:langref30.pdf, pg. 251Оператор MERGE, затрагивающий не более одной строки , может содержать
конструкцию RETURNING для возвращения значений добавленной, модифицируемой
или удаляемой строки
Вот статистика из трейса для merge-returning'a, который обламывается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Statement 25:
-------------------------------------------------------------------------------
merge into t using s on s.id=t.id when not matched then insert values(s.id, s.y)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN JOIN (S NATURAL, T INDEX (RDB$PRIMARY3))
0 records fetched
      0 ms, 1 read(s), 19 fetch(es), 2 mark(s)

Table                             Natural     Index    Update    Insert    Delete
**********************************************************************************
 T                                                 1                   1 
 S                                       2 

А теперь вопрос. Что подразумевается под "затрагиванием" - источник, что ле ?!
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971805
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

вообще-то приёмик

merge into target using source ...
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971812
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

ну, и ? я затронул приёмник только 1 раз, чего он обламывается тогда ?
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971835
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

new и old могут быть только в приёмнике. Но returning может содержать выражение не только из приёмника. Преобразуем твой первый пример так

Код: sql
1.
2.
3.
merge into t using (select * from s where id>=2) s on s.id=t.id
when not matched then insert values(s.id, s.y)
returning new.id as new_t_id, new.x + s.Y as new_t_x;



никакой ошибки нет. Вероятно причина в этом. Т.е. похоже не в приёмнике
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971839
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

тут наверное правильнее сказать что в источнике может быть только 1 запись
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971862
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистут наверное правильнее сказать что в источнике может быть только 1 записьЭто требование выглядит очень странно. Если в источнике совпало с USING-требованием 100500 записей, но в приёмнике в итоге WHEN-разруливаний была изменена строго одна запись, то что мешает вывести RETURNING-результат ? С какого будуна там будет "multiple rows in singleton select" ?
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971879
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

моё мнение таково что если в источнике более одной строки, то returning применять нельзя. Ибо никто не даст гарантии что каждый раз там будет обновлена только 1 строка. Так что фича вроде бы есть, но применять её можно очень ограничено.
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971886
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисмоё мнение таково что если в источнике более одной строки, то returning применять нельзя. Ибо никто не даст гарантии что каждый раз там будет обновлена только 1 строка.Дык никто и не требует гарантии от источника, который, например, пытается вставить бубликаты в таблицу с PK/UK (я сейчас не про merge): стейтмент обламывается, и всё, дальше - проблема индейца.
Что здесь мешает тоже самое сбацать ?
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971890
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

для источника такую гарантию можно дать почти всегда, но это должен делать проектировщик. RDB$DATABASE, запрос с агрегатами без группировок, FIRST(1)/ROWS 1 и т.д.
...
Рейтинг: 0 / 0
MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
    #38971892
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

этот вопрос не ко мне
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / MERGE, затрагивающий не более 1 строки, может сод. RETURNING. Про "чью" строку речь?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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