Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Почему условие не работает ?  [new]
1
Guest
Есть такой запрос:
    SELECT mob_num, po, ls, tpo_n, tpo_name, client_n, client_typ, client,
           decode(NETAR_GOL,0,to_number(null),NETAR_GOL) NETAR_GOL,
           decode(TAR_GOL,0,to_number(null),TAR_GOL) TAR_GOL,
           decode(NETAR_DAN,0,to_number(null),NETAR_DAN) NETAR_DAN,
           decode(TAR_DAN,0,to_number(null),TAR_DAN) TAR_DAN,
           decode(STOIM_GOL,0,to_number(null),STOIM_GOL) STOIM_GOL,
           decode(STOIM_DAN,0,to_number(null),STOIM_DAN) STOIM_DAN,
           gr_mob_num, gr_client
      FROM                      
    (select decode(grouping(mob_num),1,'ИТОГО:',mob_num) mob_num, 
            po, ls, tpo_n, tpo_name, client_n, client_typ, client,
            sum(NETAR_GOL_VCH+NETAR_GOL_ISCH) NETAR_GOL,
            sum(TAR_GOL_VCH+TAR_GOL_ISCH) TAR_GOL,
            round(sum(NETAR_DAN_VCH+NETAR_DAN_ISCH)/1024/1024,3) NETAR_DAN,
            round(sum(TAR_DAN_VCH+TAR_DAN_ISCH)/1024/1024,3) TAR_DAN,            
            round(sum(STOIM_GOL),3) STOIM_GOL,
            round(sum(STOIM_DAN),3) STOIM_DAN,
            grouping(mob_num) gr_mob_num,grouping(client) gr_client
       from apeks.sumdet
      where tr_strt between sysdate-20 and sysdate-1
        and client_typ like '%' and client_n like '%'
        and tpo_n like '%'
        and evdo>=0
   group by rollup (mob_num, po, ls, tpo_n, tpo_name, client_n, client_typ, client)
     having grouping(client)=0 or grouping(mob_num)=1
[b]   union all
     select null mob_num, null po, null ls, null tpo_n, null tpo_name, 
            null client_n, null client_typ, null client,0 netar_gol,0 tar_gol,
            0 netar_dan,0 tar_dan,
            null,null,0.1 gr_mob_num,0.1 gr_client from dual
   union all
     select null mob_num, null po, null ls, null tpo_n, null tpo_name, 
            null client_n, null client_typ, null client, 0 netar_gol,0 tar_gol,
             0 netar_dan,0 tar_dan,
            null,null,0.1 gr_mob_num,0.1 gr_client from dual[/b]
  )

    [color=red] WHERE NETAR_GOL>100 [/color]

Так вот условие WHERE NETAR_GOL>100 НЕ РАБОТАЕТ!

Если же из запроса убираем придложения с подзапросами union all:

    SELECT mob_num, po, ls, tpo_n, tpo_name, client_n, client_typ, client,
           decode(NETAR_GOL,0,to_number(null),NETAR_GOL) NETAR_GOL,
           decode(TAR_GOL,0,to_number(null),TAR_GOL) TAR_GOL,
           decode(NETAR_DAN,0,to_number(null),NETAR_DAN) NETAR_DAN,
           decode(TAR_DAN,0,to_number(null),TAR_DAN) TAR_DAN,
           decode(STOIM_GOL,0,to_number(null),STOIM_GOL) STOIM_GOL,
           decode(STOIM_DAN,0,to_number(null),STOIM_DAN) STOIM_DAN,
           gr_mob_num, gr_client
      FROM                      
    (select decode(grouping(mob_num),1,'ИТОГО:',mob_num) mob_num, 
            po, ls, tpo_n, tpo_name, client_n, client_typ, client,
            sum(NETAR_GOL_VCH+NETAR_GOL_ISCH) NETAR_GOL,
            sum(TAR_GOL_VCH+TAR_GOL_ISCH) TAR_GOL,
            round(sum(NETAR_DAN_VCH+NETAR_DAN_ISCH)/1024/1024,3) NETAR_DAN,
            round(sum(TAR_DAN_VCH+TAR_DAN_ISCH)/1024/1024,3) TAR_DAN,            
            round(sum(STOIM_GOL),3) STOIM_GOL,
            round(sum(STOIM_DAN),3) STOIM_DAN,
            grouping(mob_num) gr_mob_num,grouping(client) gr_client
       from apeks.sumdet
      where tr_strt between sysdate-20 and sysdate-1
        and client_typ like '%' and client_n like '%'
        and tpo_n like '%'
        and evdo>=0
   group by rollup (mob_num, po, ls, tpo_n, tpo_name, client_n, client_typ, client)
     having grouping(client)=0 or grouping(mob_num)=1
    )

    [color=red] WHERE NETAR_GOL>100 [/color]

то условие работает.
10 янв 07, 09:46    [3619328]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
Примерные данные в студию!
10 янв 07, 09:55    [3619372]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Elic
Member

Откуда:
Сообщений: 29990
1
Так вот условие WHERE NETAR_GOL>100 НЕ РАБОТАЕТ!
RTFM
10 янв 07, 09:57    [3619382]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
ТАк глазом глянул :

and client_typ like '%' and client_n like '%'
        and tpo_n like '%'

А зачем?
ИМХО долго работать будет .
10 янв 07, 10:01    [3619408]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Олег_Сл
Примерные данные в студию!


Олег_Сл
Примерные данные в студию!


mob_num | ... | NETAR_GOL | TAR_GOL | ... |
--------------------------------------------
001 | | 1 | 2 | ... |
002 | | 12 | 34 | ... |
003 | | 5 | 6 | ... |
004 | | 300 | 8 | ... |
....................................
008 | | 1 | 7 | ... |
| | | | ... |
ИТОГО: | | 234546 | 345432 | ... |


Нужно по столбцу NETAR_GOL отсеить те данные, к-е допустим меньше 100. Но запрос всё равно выдаёт все записи, как буд-то условия нет вообще. Если же убрать union или предложение having, то всё работает.
10 янв 07, 10:11    [3619499]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Олег_Сл
ТАк глазом глянул :

and client_typ like '%' and client_n like '%'
        and tpo_n like '%'

А зачем?
ИМХО долго работать будет .


В этих местах у меня стоят параметры, по которым отсеиваются данные. '%' вставил для тестирования.
10 янв 07, 10:13    [3619511]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
1. Пример таблицы apeks.sumdet !(10-15 строчек разного вида.)

2. А зачем вам запросы с union all если в конце они всё равно отсеяться WHERE NETAR_GOL>100 ?
10 янв 07, 10:16    [3619536]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Elic
Member

Откуда:
Сообщений: 29990
1
Нужно по столбцу NETAR_GOL отсеить те данные, к-е допустим меньше 100. Но запрос всё равно выдаёт все записи, как буд-то условия нет вообще. Если же убрать union или предложение having, то всё работает.
Покожи планы с предикатами обоих запросов.
10 янв 07, 10:26    [3619595]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Олег_Сл

2. А зачем вам запросы с union all если в конце они всё равно отсеяться WHERE NETAR_GOL>100 ?


Точно, а я и не заметил.
10 янв 07, 10:29    [3619613]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Олег_Сл
1. Пример таблицы apeks.sumdet !(10-15 строчек разного вида.)


Приложен файл.

К сообщению приложен файл (1.xls - 7Kb) cкачать
10 янв 07, 10:31    [3619627]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Part
Member

Откуда: Краснодар
Сообщений: 187
Планы покажи, такое, ИМХО, чувство, что Oracle на битый индекс "садится"
10 янв 07, 10:49    [3619759]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
1

Олег_Сл


2. А зачем вам запросы с union all если в конце они всё равно отсеяться WHERE NETAR_GOL>100 ?



Точно, а я и не заметил.


Вопрос решился ?
Или смотрим дальше?
10 янв 07, 11:22    [3619995]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Part
Планы покажи, такое, ИМХО, чувство, что Oracle на битый индекс "садится"
10 янв 07, 11:28    [3620045]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
1
Part
Планы покажи, такое, ИМХО, чувство, что Oracle на битый индекс "садится"


Планы приложены в файле

К сообщению приложен файл (plan.xls - 15Kb) cкачать
10 янв 07, 11:29    [3620049]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Олег_Сл
1

Олег_Сл


2. А зачем вам запросы с union all если в конце они всё равно отсеяться WHERE NETAR_GOL>100 ?



Точно, а я и не заметил.


Вопрос решился ?
Или смотрим дальше?


Вообще думаю так и так придётся ставить условие во внутренний запрос, там должно быть всё гладко. Но всё-таки мне интересно почему же не работает.
Хм, только что заметил. Это условие РАБОТАЕТ !?, НО только для подзапроса:
union all
     select null mob_num, null po, null ls, null tpo_n, null tpo_name, 
            null client_n, null client_typ, null client,0 netar_gol,0 tar_gol,
            0 netar_dan,0 tar_dan,
            null,null,0.1 gr_mob_num,0.1 gr_client from dual
   union all
     select null mob_num, null po, null ls, null tpo_n, null tpo_name, 
            null client_n, null client_typ, null client, 0 netar_gol,0 tar_gol,
             0 netar_dan,0 tar_dan,
            null,null,0.1 gr_mob_num,0.1 gr_client from dual

Вот эти две записи и отсеиваются, а записи из основного подзапроса почему-то остаются !? Что за глюки.
10 янв 07, 11:35    [3620094]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Олег_Сл
Member

Откуда: Санкт-Петербург
Сообщений: 123
Попробывал у меня всё получилось.

Oracle9i Enterprise Edition Release 9.2.0.8.0
10 янв 07, 11:37    [3620106]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
1
Guest
Олег_Сл
Попробывал у меня всё получилось.

Oracle9i Enterprise Edition Release 9.2.0.8.0


У меня Oracle9i Enterprise Edition Release 9.2.0.5.0

В принципе сделал. Добавил это условие в предложение having:

having (grouping(client)=0 or grouping(mob_num)=1)
        and (sum(NETAR_GOL_VCH+NETAR_GOL_ISCH))>=100

Хотя почему там не работало, мне не понятно.
10 янв 07, 11:41    [3620124]     Ответить | Цитировать Сообщить модератору
 Re: Почему условие не работает ?  [new]
Part
Member

Откуда: Краснодар
Сообщений: 187
Сделайте нормальные планы через
explain plan for ...
select * from table(dbms_xplan.display);
интересно что происходит с предикатами
10 янв 07, 15:32    [3622039]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить