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

Откуда: Железные острова
Сообщений: 180
Всем привет,

есть две таблицы:

create table t1 as 
select  1 t,level id,case when level in (2,4) then null else level end id1
  from dual 
 connect by level < 10
create table t2 as 
select  2 t
        ,level id
        ,case when level in (2,3,8) then null else level end id1
  from dual 
 connect by level < 10


необходимо найти найти все записи из t1 для которых должны выполняться условия:
  • если t1.id1 is not null и t2.id1 is not null, то запись выводится при условии t1.id1 = t2.id1
  • если t1.id1 is null и t2.id1 is null, то запись выводится
  • если t1.id1 is null и t2.id1 is not null, то запись не выводится

    Запрос
    select  t1.t,t1.id,t1.id1,t2.t,t2.id,t2.id1
    ....
    
    должен вернуть значения:

    t1.tt1.idt1.id1t2.tt2.idt2.id1
    111211
    12
    133
    155255
    166266
    177277
    188
    199299
  • 16 янв 19, 15:24    [21786837]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    Dshedoo
    Member

    Откуда:
    Сообщений: 393
    cobalt_frog,

    Почему t1.id = 3 возвращается?
    По условиям t1.id1 is not null должен сджойниться только с t2.id1 = 3, которой нет.

    З.Ы. курите NVL
    16 янв 19, 15:37    [21786862]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    cobalt_frog
    Member

    Откуда: Железные острова
    Сообщений: 180
    Dshedoo
    cobalt_frog,

    Почему t1.id = 3 возвращается?
    По условиям t1.id1 is not null должен сджойниться только с t2.id1 = 3, которой нет.

    З.Ы. курите NVL


    Задача такая, что значение 3 должно возвращаться.
    + доп условие:

    • если t1.id1 is not null и t2.id1 is null, то запись выводится
    16 янв 19, 15:46    [21786883]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    Dshedoo
    Member

    Откуда:
    Сообщений: 393
    cobalt_frog
    Dshedoo
    cobalt_frog,

    Почему t1.id = 3 возвращается?
    По условиям t1.id1 is not null должен сджойниться только с t2.id1 = 3, которой нет.

    З.Ы. курите NVL


    Задача такая, что значение 3 должно возвращаться.
    + доп условие:

    • если t1.id1 is not null и t2.id1 is null, то запись выводится


    Я обратился к местному экстрасенсу, он утверждает, что у вас в условиях кое-где перепутаны id1 и id.
    16 янв 19, 16:07    [21786934]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    Dshedoo
    Member

    Откуда:
    Сообщений: 393
    with t as (select  1 t,level id,case when level in (2,4) then null else level end id1
      from dual
     connect by level < 10)
    , t2 as (
    select  2 t
            ,level id
            ,case when level in (2,3,8) then null else level end id1
      from dual
     connect by level < 10)
    
     select * from t join t2 on nvl(t.id1,-1) = nvl(nvl(t2.id1,t.id1),-1) and t.id = t2.id 
    order by 1,2
    
    16 янв 19, 16:08    [21786938]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    cobalt_frog
    Member

    Откуда: Железные острова
    Сообщений: 180
    Dshedoo
    with t as (select  1 t,level id,case when level in (2,4) then null else level end id1
      from dual
     connect by level < 10)
    , t2 as (
    select  2 t
            ,level id
            ,case when level in (2,3,8) then null else level end id1
      from dual
     connect by level < 10)
    
     select * from t join t2 on nvl(t.id1,-1) = nvl(nvl(t2.id1,t.id1),-1) and t.id = t2.id 
    order by 1,2
    


    столбец id указан просто для примера, на него не стоит ориентироваться.
    16 янв 19, 16:16    [21786954]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    Dshedoo
    Member

    Откуда:
    Сообщений: 393
    cobalt_frog
    Dshedoo
    with t as (select  1 t,level id,case when level in (2,4) then null else level end id1
      from dual
     connect by level < 10)
    , t2 as (
    select  2 t
            ,level id
            ,case when level in (2,3,8) then null else level end id1
      from dual
     connect by level < 10)
    
     select * from t join t2 on nvl(t.id1,-1) = nvl(nvl(t2.id1,t.id1),-1) and t.id = t2.id 
    order by 1,2
    


    столбец id указан просто для примера, на него не стоит ориентироваться.


    Тогда строка с t.id = 4 не укладывается в описанную логику.
    Так как t.id1 is null должен сджойниться с любой строкой, где t2.id1 is null, т.е. с 3 строками, у которы t2.id in (2,3,8).
    16 янв 19, 16:19    [21786961]     Ответить | Цитировать Сообщить модератору
     Re: Запрос  [new]
    cobalt_frog
    Member

    Откуда: Железные острова
    Сообщений: 180
    Dshedoo
    cobalt_frog
    пропущено...


    столбец id указан просто для примера, на него не стоит ориентироваться.


    Тогда строка с t.id = 4 не укладывается в описанную логику.
    Так как t.id1 is null должен сджойниться с любой строкой, где t2.id1 is null, т.е. с 3 строками, у которы t2.id in (2,3,8).


    в том то и дело( придется доп логику заводить для задачи на новый столбец.
    Если вводить новый столбец, то ваш способ работает. Спсибо.
    16 янв 19, 16:26    [21786978]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить