powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / merge: не совпадают результаты FB и Oracle (again cursor stability ?)
6 сообщений из 31, страница 2 из 2
merge: не совпадают результаты FB и Oracle (again cursor stability ?)
    #38587527
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ орацле ты не добьёшься случайных результатов вышепоказанного мёрджа, если
будешь заталкивать в таблицу строки в random-порядке:
А ты ему скорми кореллированный подзапрос вместо инварианта. Вот тогда и посмеёмся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
merge: не совпадают результаты FB и Oracle (again cursor stability ?)
    #38587529
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovскорми кореллированный подзапрос вместо инварианта. Вот тогда и посмеёмся.
Код: plaintext
1.
2.
3.
4.
merge into t 
using(select x,y from t2) s 
on (t.x=s.y) 
when matched then 
  update set t. y  = ( select count(*) from t where x <>  y  );
а это чё, не коррелированый разве ? (покажи набросок, что именно ему скармливать надо)
...
Рейтинг: 0 / 0
merge: не совпадают результаты FB и Oracle (again cursor stability ?)
    #38587532
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоида это чё, не коррелированый разве ?
Нет, конечно. И х и у берутся из таблицы самого подзапроса. Попробуй это:
Код: sql
1.
2.
3.
4.
5.
merge into t
using(select x,y from t2) s
   on (t.x=s.y)
when matched then
   update set t.y = ( select count(*) from t t3 where t.x <> t3.y );


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
merge: не совпадают результаты FB и Oracle (again cursor stability ?)
    #38587538
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
5.
merge into t
using(select x,y from t2) s
   on (t.x=s.y)
when matched then
   update set t.y = ( select count(*) from t t3 where t.x <> t3.y );

Код: plaintext
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.
29.
15:47:30>rollback;
15:47:38>select * from t;

         X          Y
---------- ----------
         3          3
         2          4
         5          1
         4          2
         1          5
15:47:44>select * from t2;

         X          Y
---------- ----------
         3          3
         2          4
         5          1
         4          2
         1          5
15:47:47>merge into t using(select x,y from t2 order by dbms_random.value) s on (t.x=s.y)
  2   when matched then update set t.y = ( select count(*) from t t3 where t.x <> t3.y );
15:47:52>select * from t;

         X          Y
---------- ----------
         3          4
         2          4
         5          4
         4          4
         1          4
...
Рейтинг: 0 / 0
merge: не совпадают результаты FB и Oracle (again cursor stability ?)
    #38591794
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

проблема с MERGE в том, что в нашей реализации это не самостоятельный запрос, а синтаксический сахар.
Конкретный твой MERGE
Код: sql
1.
2.
3.
merge into t using (select x, y from t2) s on t.x = s.y
  when matched
  then update set t.y = (select count(*) from t t3 where t3.x <> t3.y);


преобразуется движком в
Код: sql
1.
2.
3.
4.
5.
6.
7.
for select t.rdb$db_key
    from t right join t2 on t.x = t2.y
    into :pk
  do 
  if (pk is not null)
  then update t set t.y = (select count(*) from t t3 where t3.x <> t3.y)
        where t.rdb$db_key = :pk;


При этом подзапрос с t3 уже не есть часть курсора (for select'а) и поэтому ему не обеспечивается стабильность (игнорирование нижележащих изменений).
Как с этим бороться на уровне движка я пока не придумал.

Но, зная механику, легко обойти данное поведение - сделать подзапрос частью курсора,
например так
Код: sql
1.
2.
3.
merge into t using (select x, y, (select count(*) from t t3 where t3.x <> t3.y) z from t2) s on t.x = s.y
  when matched
  then update set t.y = s.z;
...
Рейтинг: 0 / 0
merge: не совпадают результаты FB и Oracle (again cursor stability ?)
    #38591973
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

я понял. Спасибо, попробую.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / merge: не совпадают результаты FB и Oracle (again cursor stability ?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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