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

Откуда:
Сообщений: 358
Подзапрос не разрешен в Left join для Оракла, как можно переписать данный запрос?

  select 'sd' || c1
      case when emp.c2 = 'C' then 'CL'
      when emp.c3 = 'F' then 'FO'
      when emp.c3 = 'T' then 'TR'
      when emp.c3 = 'D' then 'DS'
      else 'XX' end || c4
      rpad(cast(emp.c1 as VARCHAR(400)),16,' ')
      from tb1 emp left join tb2 nf on ((nf.c9 = emp.c1) and
                                         ([b]nf.c10 IN(select max(nfs.c88) from tb2 nfs
         where nfs.c10 = emp.c1)[/b]))
      left join tb3 ender on ender.c45 = nf.c9
      where emp.c2 in('C')
23 ноя 10, 10:46    [9823485]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
SQLap
Member [заблокирован]

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

from tb1 emp left join (select * from tb2 where c10 IN (select max(nfs.c88) from tb2 nfs
         where nfs.c10 = emp.c1)) nf on (nf.c9 = emp.c1)
23 ноя 10, 11:06    [9823632]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
-2-
Member

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

В OUTER не разрешен OR. Текст ошибки...
23 ноя 10, 11:06    [9823633]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
-2-
Member

Откуда:
Сообщений: 15330
-2-
В OUTER не разрешен OR.
с WHERE(+)
23 ноя 10, 11:12    [9823692]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
stavelot
Member

Откуда:
Сообщений: 358
SQLap
stavelot,

from tb1 emp left join (select * from tb2 where c10 IN (select max(nfs.c88) from tb2 nfs
         where nfs.c10 = emp.c1)) nf on (nf.c9 = emp.c1)



Колонка emp.c1 из where nfs.c10 = emp.c1 не видна, поэтому получаю ошибку: ORA-00904: "EMP"."С1": invalid identifier
23 ноя 10, 11:30    [9823844]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
SQLap
Member [заблокирован]

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

да? Нет под рукой >= 9 чтобы проверить
Тогда придется переформировать подзапрос из

left join (подзапрос) 
нужным тебе соединением tab2 и tab1 с группировкой, вынести эту красоту во FROM и написать к нему WHERE с плюсиком, как уже подсказали
23 ноя 10, 12:34    [9824414]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
stavelot
Member

Откуда:
Сообщений: 358
SQLap
stavelot,

да? Нет под рукой >= 9 чтобы проверить
Тогда придется переформировать подзапрос из

left join (подзапрос) 
нужным тебе соединением tab2 и tab1 с группировкой, вынести эту красоту во FROM и написать к нему WHERE с плюсиком, как уже подсказали


И так тоже не выходит обмануть Оракл:
from tb1 emp tb2 nf  WHERE nf.c10 IN(select max(nfs.c88) from tb2 nfs and nf.c9 = emp.c1(+)

Ругается, не нравится ему это.
2 дек 10, 14:22    [9875513]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
SQLap
Member [заблокирован]

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

ну надо что-то вроде этого наверное

  select 'sd' || c1
      case when emp.c2 = 'C' then 'CL'
      when emp.c3 = 'F' then 'FO'
      when emp.c3 = 'T' then 'TR'
      when emp.c3 = 'D' then 'DS'
      else 'XX' end || c4
      rpad(cast(emp.c1 as VARCHAR(400)),16,' ')
      from tb1 emp,
      (select max(nfs.c88), nf.c9, nf.c10
        from tb2 nf, tb2 nfs
         where nf.c9 = nfs.c10
          group by nf.c9, nf.c10
          having max(nfs.c88) = nf.c10) nf2,
      tb3 ender
      where emp.c2 in ('C') and ender.c45 = nf2.c9 and nf2.c9 = emp.c1 (+)    

ЗЫ хотя сложно при такой постановке задачи (без исходных данных и что треба) что-то правильно получить.
2 дек 10, 15:01    [9875823]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в LEFT JOIN  [new]
Политолог
Guest
Сделал бы так (если правильно понял задачу):
select 'sd' || c1
      case when emp.c2 = 'C' then 'CL'
      when emp.c3 = 'F' then 'FO'
      when emp.c3 = 'T' then 'TR'
      when emp.c3 = 'D' then 'DS'
      else 'XX' end || c4
      rpad(cast(emp.c1 as VARCHAR(400)),16,' ')
from
(
select emp.c1, emp.c2, emp.c3, emp.c4,
nfs.c10, max(max(nfs.c88)) over (partition by nfs.c10) max_nfs10 from tb2 nfs join tb1 emp on nfs.c10=emp.c1
group by emp.c1, emp.c2, emp.c3, emp.c4,
nfs.c10
) emp left join tb2 nf on nf.c9=emp.c1 and nf.c10=max_nfs10
left join tb3 ender on ender.c45 = nf.c9
      where emp.c2 in('C')
2 дек 10, 15:44    [9876210]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить