Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
Необходимо строки таблицы tab "проверить" на разные условия. Для этого отлично подходит multi insert:
 insert
          when условие1 then
              into  test(key,kderr)
              values (key,1)
          when условие2 then
              into  test(key,kderr)
              values (key,2)
          when условие3 then
              into  test(key,kderr)
              values (key,3)
          when условие4 then
              into  test(key,kderr)
              values (key,1)
           select *
           from tab src

но мне бы так же не хотелось, чтобы в таблице test плодились двойные одинаковые записи (в моем случае это возможно, так как
в 1 и 4 условиях - на выходе один и тот же kderr). В этом случае был бы идеален неполный merge по (key, kderr) c инсертом

Но как это все подружить вместе с минимальными потерями?

multi merge я не нашел вроде

v11.2.0.3
17 мар 14, 13:51    [15738052]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
До кучи. Дело тут не только в "дубликатах". Хотелось бы "перезапускаемую" процедуру - так как кол-во условий может меняться как и их вид. Соответственно хотелось бы возможность "проверять" таблицу еще раз, добавляя только то, чего еще нет

Предварительная очистка - не вариант, так как
1) успешные результаты "проверки" должны остаться, даже если исчезло условие, которое их породило
2) в таблице test может быть так же столбец: dt - дата попадения в таблицу записи. Соответственно эту инфу нельзя терять
17 мар 14, 13:55    [15738090]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
123йй
Member

Откуда:
Сообщений: 1637
stil
в моем случае это возможно, так как
в 1 и 4 условиях - на выходе один и тот же kderr

сделать 1 и 4 как одно условие
17 мар 14, 13:55    [15738092]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
123йй,

не всегда это возможно. А уж точно не всегда наглядно. Плюс иногда хотелось бы иметь "историю" проверок, которые копятся со временем (хотя это уже высосано из пальца)

Ну в общем основная таки причина поиска решения - в моем втором посте
17 мар 14, 14:00    [15738130]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
-2-
Member

Откуда:
Сообщений: 15330
stil
Для этого отлично подходит multi insert:
 insert
          when условие1 then
              into  test(key,kderr)
              values (key,1)
          when условие2 then
              into  test(key,kderr)
              values (key,2)
          when условие3 then
              into  test(key,kderr)
              values (key,3)
          when условие4 then
              into  test(key,kderr)
              values (key,1)
           select *
           from tab src
multiTABLE insert подходит для вставки в несколько таблиц. Для вставки в одну таблицу отлично походит обычный insert.
17 мар 14, 14:03    [15738164]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
eev
Member

Откуда: -
Сообщений: 1156
stil,

insert
           select key,
case 
when условие1 (and/or) условие4 ... ещё какаянить шляпа then 1
и т.д.
           from tab src
17 мар 14, 14:08    [15738204]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
-2-
stil
Для этого отлично подходит multi insert:
 insert
          when условие1 then
              into  test(key,kderr)
              values (key,1)
          when условие2 then
              into  test(key,kderr)
              values (key,2)
          when условие3 then
              into  test(key,kderr)
              values (key,3)
          when условие4 then
              into  test(key,kderr)
              values (key,1)
           select *
           from tab src
multiTABLE insert подходит для вставки в несколько таблиц. Для вставки в одну таблицу отлично походит обычный insert.

В теории - да: n-совершенно разнородных условий можно было извратиться и переписать в один select, а потом его пачкой вставить..
Но соответствующий select получается очень монструозен и сильно не оптимален

Так же можно за-union-ить кучу селектов из test под каждое условие - будет читабельней, но и будет n-фуллсканов(так и было когда то)

В общем изящный структурированный multi insert меня вполне устраивал - если б не мелкие минусы описанные выше

К минусам: при определенном размере - около 250 условий - он отказался работать ) Точную ошибку не вспомню уже..

В о
17 мар 14, 14:11    [15738242]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
eev
stil,

insert
           select key,
case 
when условие1 (and/or) условие4 ... ещё какаянить шляпа then 1
и т.д.
           from tab src

Вот как раз "условие1 (and/or) условие4 ... ещё какаянить шляпа" в моем случае и превращают итоговый запрос в монструозное чудо..

Плюс это никак не решает проблему перезапуска.. Если только не вставить в конце условие
and (key, kderr) not in (select key,kderr from test)

конечно...
17 мар 14, 14:15    [15738293]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
Elic
Member

Откуда:
Сообщений: 29979
stil
Но соответствующий select получается очень монструозен и сильно не оптимален
Чудо, снимись с ручника. Case-выражение для простого insert-а будет короче твоего "произведения" на -ннадцать
              into  test(key,kderr)
              values (key,)
stil
никак не решает проблему перезапуска
RTFM MERGE
17 мар 14, 14:31    [15738460]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
 create table tst(ky number,kderr number); 
 
 insert
          when col>0 then
              into  tst(ky,kderr)
              values (col,1)
          when col>1 then
              into  tst(ky,kderr)
              values (col,2)
          when col>2 then
              into  tst(ky,kderr)
              values (col,3)
          when col>3 then
              into  tst(ky,kderr)
              values (col,1)
           select *
           from (        
           select 1 col from dual
           union all
           select 2 col from dual
           union all
           select 3 col from dual
           )


Дайте плз аналог через case when - чето до меня не доходит
17 мар 14, 18:54    [15740777]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
Elic
Member

Откуда:
Сообщений: 29979
stil
 insert
          when col>0 then
              into  tst(ky,kderr)
              values (col,1)
          when col>1 then
Дайте плз аналог через case when - чето до меня не доходит
 insert into tst(ky,kderr)
   select col, 
        case
          when col>0 then 1
          when col>1 then ...
18 мар 14, 11:41    [15743805]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
Elic,

если
 
insert into tst(ky,kderr)
   select col, 
        case
          when col>0 then 1
          when col>1 then 2
          when col>2 then 3
          when col>3 then 1
        end  
     from (        
           select 1 col from dual
           union all
           select 2 col from dual
           union all
           select 3 col from dual
           )

Имели ввиду Вы, то не пойдет: результат моего инсерта - вставка 6 строк, Вашего - 3 строки
18 мар 14, 12:43    [15744544]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
Elic,

в общем Ваш инсерт эквивалентен многотабличному INSERT FIRST, а мне нужно INSERT ALL. Если я правильно понял Ваш пост
18 мар 14, 12:49    [15744637]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
eev
Member

Откуда: -
Сообщений: 1156
stil
не пойдет: результат моего инсерта - вставка 6 строк, Вашего - 3 строки

stil
но мне бы так же не хотелось, чтобы в таблице test плодились двойные одинаковые запис
18 мар 14, 12:55    [15744690]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
eev
stil
не пойдет: результат моего инсерта - вставка 6 строк, Вашего - 3 строки

stil
но мне бы так же не хотелось, чтобы в таблице test плодились двойные одинаковые запис

Результат моего инсерта разные 6 записей. Посмотрите повнимательнее
18 мар 14, 13:17    [15744949]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
eev,

Мне бы хотелось избавиться от дубликатов
1) при повторном прогоне инсерта ("перезапуск")
2) если два разных условия (в примере условия 1 и 4) породили одинаковую запись: один key, один kderr

Но вполне допустимы
1) вставка нескольких записей - если все они удовлетворили условию (key разные, kderr один)
2) вставка нескольких записей для единственной исходной - если она удовлетворяет нескольким условиям (key один, kderr разные)
18 мар 14, 13:25    [15745025]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
Итого - решением будет просто предварительное формирование набора например в GTT. А потом merge его в конечную таблицу. Ибо
merge + multi insert в чистом универсальном виде явно невозможен (слишком много "НО" чисто логически)

P.S. Но решение моей задачи через case when и обычный инсерт хотелось бы посмотреть. Из исследовательских соображений
18 мар 14, 13:30    [15745068]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
-2-
Member

Откуда:
Сообщений: 15330
stil
P.S. Но решение моей задачи через case when и обычный инсерт хотелось бы посмотреть. Из исследовательских соображений
Джоин с размножителем по условиям в case when...
18 мар 14, 13:37    [15745128]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
stil
Member

Откуда: Кемерово
Сообщений: 1295
-2-
stil
P.S. Но решение моей задачи через case when и обычный инсерт хотелось бы посмотреть. Из исследовательских соображений
Джоин с размножителем по условиям в case when...

Я об этом думал когда то. Но сомневаюсь я чего-то, что это будет "короче моего "произведения" на -ннадцать". В общем случае
18 мар 14, 13:52    [15745294]     Ответить | Цитировать Сообщить модератору
 Re: multi и merge. Возможно ли такое?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Думал использовать хинт IGNORE_ROW_ON_DUPKEY_INDEX, но он не катит для multi-table INSERT (а зря):

ORA-38917: IGNORE_ROW_ON_DUPKEY_INDEX hint disallowed for this operation

Mожно что-то типа:

SCOTT@orcl > drop table tbl purge
  2  /

Table dropped.

SCOTT@orcl > create table tbl
  2    as
  3      select  level n
  4        from  dual
  5        connect by level <= 3
  6  /

Table created.

SCOTT@orcl > drop table tbl1_errlog purge
  2  /

Table dropped.

SCOTT@orcl > drop table tbl2_errlog purge
  2  /

Table dropped.

SCOTT@orcl > drop table tbl3_errlog purge
  2  /

Table dropped.

SCOTT@orcl > drop table tbl1 purge
  2  /

Table dropped.

SCOTT@orcl > drop table tbl2 purge
  2  /

Table dropped.

SCOTT@orcl > drop table tbl3 purge
  2  /

Table dropped.

SCOTT@orcl > create table tbl1(n number)
  2  /

Table created.

SCOTT@orcl > alter table tbl1
  2    add constraint tbl1_pk
  3      primary key(n)
  4  /

Table altered.

SCOTT@orcl > create table tbl2(n number)
  2  /

Table created.

SCOTT@orcl > alter table tbl2
  2    add constraint tbl2_pk
  3      primary key(n)
  4  /

Table altered.

SCOTT@orcl > create table tbl3(n number)
  2  /

Table created.

SCOTT@orcl > alter table tbl3
  2    add constraint tbl3_pk
  3      primary key(n)
  4  /

Table altered.

SCOTT@orcl > begin
  2      dbms_errlog.create_error_log('tbl1','tbl1_errlog');
  3      dbms_errlog.create_error_log('tbl2','tbl2_errlog');
  4      dbms_errlog.create_error_log('tbl3','tbl3_errlog');
  5  end;
  6  /

PL/SQL procedure successfully completed.

SCOTT@orcl > insert
  2    when n = 1 then
  3    into tbl1
  4    values(n)
  5    log errors into tbl1_errlog('err')
  6    reject limit unlimited
  7    when n = 2 then
  8    into tbl1
  9    values(n)
 10    log errors into tbl2_errlog('err')
 11    reject limit unlimited
 12    when n = 3 then
 13    into tbl1
 14    values(n)
 15    log errors into tbl3_errlog('err')
 16    reject limit unlimited
 17  select  *
 18    from  tbl
 19  /

3 rows created.

SCOTT@orcl > /

0 rows created.

SCOTT@orcl > 


Но придется шерстить errlog таблицы на предмет не ORA-00001 ошибок.

SY.

Сообщение было отредактировано: 18 мар 14, 16:20
18 мар 14, 16:19    [15747016]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить