Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
Гость №130410
Guest
Существует процедура, в которой данные записываются в таблицу
create or replace procedure f_fill_table (p_param in varchar2, p_where in varchar2)
is
begin
  if p_where = 'empty' then
    insert into result_table (filed1, field2, field3)
    select t1.field1, t1.field2, concat(t2.field2, t3.field2) from table1 t1
      inner join table2 t2 on t2.field1=t1.filed3
      inner join table3 t3 on t3.field1=t1.filed4
    where t1.field1=p_param;
  else
    insert into result_table (filed1, field2, field3)
    select t1.field1, t1.field2, concat(t2.field2, t3.field2) from table1 t1
      inner join table2 t2 on t2.field1=t1.filed3
      inner join table3 t3 on t3.field1=t1.filed4
      left outer join table4 t4 on t4.field1=concat(t2.field2, t3.field2)
    where t1.field1=p_param
      and t4.field2=p_where;
  end if;
  commit;
end

Из неё видно, что в случае определённого значения парамтера p_where в запросе на вставку используется или не используется таблица table4. В остальном запросы одинаковы.
Очень интересует можно ли сделать так чтобы эти два запроса сделать одним. Сам не могу придумать, но держать два одинаковых селекта не хочется...
10 апр 13, 08:54    [14159874]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Гость №130410,

а зачем делать из этих двух запросов один?
лучше они работать не станут от этого

(извините за вопросом на вопрос)
10 апр 13, 09:15    [14159922]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Гость №130410,
+
    insert into result_table (filed1, field2, field3)
    select t1.field1, t1.field2, concat(t2.field2, t3.field2) from table1 t1
      inner join table2 t2 on t2.field1=t1.filed3
      inner join table3 t3 on t3.field1=t1.filed4
      left outer join table4 t4 on t4.field1=concat(t2.field2, t3.field2) and t4.field2=p_where
    where t1.field1=p_param;

10 апр 13, 09:17    [14159929]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
Гость №130410
Guest
ten, я очень сильно извиняюсь, но я задал маленько неправильные исходные данные.

Из-за этого в Вашем варианте теряется некоторая функциональность. Дело в том, что поля table1.field3 и table1.field4 имеют большое разнообразие значений, некоторые комбинации из них хранятся в table4.field1.
И правильно было бы записать
and t4.field2 like p_where

Потому когда в запросе
    select t1.field1, t1.field2, concat(t2.field2, t3.field2) from table1 t1
      inner join table2 t2 on t2.field1=t1.filed3
      inner join table3 t3 on t3.field1=t1.filed4
      left outer join table4 t4 on t4.field1=concat(t2.field2, t3.field2)
    where t1.field1=p_param
      and t4.field2 like p_where

мы имеем параметр p_where='%', то выбираются все записи с указанными в table4 комбинациями
а когда p_where='empty', то выбираем вообще все комбинации этих полей.

При перемещении же условия
and t4.field2 like p_where
в join получается, что разница между '%' и 'empty' теряется.
Чего не хотелось бы.
10 апр 13, 09:58    [14160102]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
Гость №130410
Guest
--Eugene--, до конца-то и не дочитали...
Как раз в последних словах ответ на Ваш вопрос.
Зачем мне два селекта, может можно как-то всё в один записать? И в случае чего изменять запрос в одном месте а не в двух.
Рефакторинг не?
10 апр 13, 10:02    [14160126]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
Да ну
Guest
Гость №130410,

А так?
select t1.field1, t1.field2, concat(t2.field2, t3.field2)
  from table1 t1
  inner join table2 t2 on t2.field1=t1.filed3
  inner join table3 t3 on t3.field1=t1.filed4
where t1.field1=p_param
  and (
    p_where = 'empty'
    or exists (
      select * from table4 t4 
       where t4.field1=concat(t2.field2, t3.field2)
         and t4.field2 like p_where
  ) )    
10 апр 13, 10:28    [14160261]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Гость №130410
разница между '%' и 'empty' теряется.

+
   insert into result_table (filed1, field2, field3)
    select t1.field1, t1.field2, concat(t2.field2, t3.field2) from table1 t1
      inner join table2 t2 on t2.field1=t1.filed3
      inner join table3 t3 on t3.field1=t1.filed4
      inner join ( select field1 from table4 t
                    where t.field2 like p_where
                      and p_where != 'empty'
                   union all
                   select 1 from dual where p_where = 'empty') t4
              on ( t4.field1=concat(t2.field2, t3.field2) and p_where != 'empty' or p_where = 'empty' )
    where t1.field1=p_param
10 апр 13, 10:43    [14160346]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Да ну,
create table table4 as select dummy field1 from dual union all select dummy from dual
10 апр 13, 10:46    [14160376]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 2006
а почему не динамический SQL?
10 апр 13, 10:55    [14160437]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Гость №130410,
Даже еще проще:
   insert into result_table (filed1, field2, field3)
    select t1.field1, t1.field2, concat(t2.field2, t3.field2) from table1 t1
      inner join table2 t2 on t2.field1=t1.filed3
      inner join table3 t3 on t3.field1=t1.filed4
      left outer join table4 t4 on t4.field1=concat(t2.field2, t3.field2) and t4.field2=p_where
    where t1.field1=p_param
      and (p_where = 'empty' or t4.field1 is not null);
10 апр 13, 11:21    [14160604]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34630
Гость №130410,

Да не надо это делать, двумя разными запросами лучше будет.
10 апр 13, 11:28    [14160650]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
Да ну
Guest
ten
Да ну,
create table table4 as select dummy field1 from dual union all select dummy from dual

Естественно, я исходил из предположения, что table4 используется как опциональный фильтр и в ней не может быть более 1 связанной записи, ибо во 2м запросе описанной процедуры в insert ничего из table4 не попадает.
10 апр 13, 11:55    [14160843]     Ответить | Цитировать Сообщить модератору
 Re: В зависимости от условий запроса в нём использовать или отключать таблицу  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Гость №130410
..
Из неё видно, что в случае определённого значения парамтера p_where в запросе на вставку используется или не используется таблица table4. В остальном запросы одинаковы.
Очень интересует можно ли сделать так чтобы эти два запроса сделать одним. Сам не могу придумать, но держать два одинаковых селекта не хочется...

перестаньте заниматься вредными глупостями.
ваше хочется-нехочется суть идиотизм
11 апр 13, 14:22    [14167209]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить