Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Избавиться от записей null


Автор: KAV2008 9.1.2012, 12:27
Подскажите  как доработать запрос (часть запроса) , что бы не было записей c null  (ora 9i) 
ps  inner join - не можем использовать из-за логики основного запроса
Код

with table1 as( 
    select  '/ius/Main.aspx' url, NULL query_string  from dual
    union  all
    select  '/ius/Main.aspx' url, NULL query_string from dual
    union  all
    select  '/ius/PageForFrame.aspx' url,  'src=http://17.28.8.13/state_units.html' query_string from dual
    union  all
    select  '/ius/PassportOfHeat.aspx' url,  NULL query_string from dual
),
    table2 as 
 
 ( select  47 id_menu, 'PageForFrame.aspx' link_menu,  1 state_id, 'http://17.28.8.13/state_units.html' src from dual
   union  all
   select 112 id_menu ,'Main.aspx' link_menu, 1 state_id, NULL src  from dual
  )
select id_menu,
            case when id_menu is null then 'null' else 'not null' end dd
    from table1 
    left join table2 on upper(substr(url, instr(url, '/', 1,2)+1,length(url)-instr(url, '/', 1,2)+1+1))=upper(link_menu)
                      and (upper(substr(query_string, 5, length(query_string)-5+1))= upper(src)
                       or (src is null and query_string is null)) 
    and table2.state_id=1    
    where  id_menu is not  null;


Полученный результат
112 not null
112 not null
47 not null
       null

Необходимый результат
112 not null
112 not null
47 not null

Спасибо

Автор: Zloxa 9.1.2012, 12:45
Цитата(KAV2008 @  9.1.2012,  12:27 Найти цитируемый пост)
 inner join - не можем использовать из-за логики основного запроса

Предикат "where  id_menu is not  null" отсекает те записи, которые вернулись бы левым соединением и делает результат эквивалентным внутреннему соединению.

Цитата(KAV2008 @  9.1.2012,  12:27 Найти цитируемый пост)
Полученный результат

 smile 
Код

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
SQL> with table1 as(
  2      select  '/ius/Main.aspx' url, NULL query_string  from dual
  3      union  all
  4      select  '/ius/Main.aspx' url, NULL query_string from dual
  5      union  all
  6      select  '/ius/PageForFrame.aspx' url,  'src=http://17.28.8.13/state_units.html' query_string from dual
  7      union  all
  8      select  '/ius/PassportOfHeat.aspx' url,  NULL query_string from dual
  9  ),
 10      table2 as
 11   ( select  47 id_menu, 'PageForFrame.aspx' link_menu,  1 state_id, 'http://17.28.8.13/state_units.html' src from dual
 12     union  all
 13     select 112 id_menu ,'Main.aspx' link_menu, 1 state_id, NULL src  from dual
 14    )
 15  select id_menu,
 16              case when id_menu is null then 'null' else 'not null' end dd
 17      from table1
 18      left join table2 on upper(substr(url, instr(url, '/', 1,2)+1,length(url)-instr(url, '/', 1,2)+1+1))=upper(link_menu)
 19                        and (upper(substr(query_string, 5, length(query_string)-5+1))= upper(src)
 20                         or (src is null and query_string is null))
 21      and table2.state_id=1
 22      where  id_menu is not  null;
 
   ID_MENU DD
---------- --------
       112 not null
       112 not null
        47 not null
 
SQL> 

Похоже на баг.

Автор: KAV2008 9.1.2012, 13:38
Что нибудь можно сделать ?

Автор: Zloxa 9.1.2012, 18:13
Цитата(KAV2008 @  9.1.2012,  13:38 Найти цитируемый пост)
Что нибудь можно сделать ? 

Что нибудь - да
1) Патчиться.
2) Найти на металинке воркэраунд.
3) Найти воркэраунд самостоятельно.

Полагаю третий случай, что ни на есть - ваш. Полагаю кляузу with и select from dual вы использовали только лишь эксперимента ради, если вместо вычитки из дуал вы подставите настоящие таблицы, думаю, результат окажется правильным. Еще, думаю, может помочь добавление предиката where rownum > 0 внутри with подзапроса. Можно попытаться переписать запрос на старый синтакси джойна, он в значительной степени более стабилен нежели ansi синтаксис.
В общем - бубен в руки, активизировать фантазию и.. - в пляс.

Автор: KAV2008 10.1.2012, 09:11
with и select from dual     использовали для наглядности вопроса
на реальных таблицах - результат аналогичный ( с нулевыми записями)
Будем экспериментировать с запросом 
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)