Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Group By + подзапрос  [new]
PavelX
Guest
Здравствуйте, уважаемые программисты.
Я работаю на оракле 6.
Вчера днем возникла казалось бы маленькая проблема, но из-за нее торможу уже полтора дня.
Нужно написать запрос, в котором идет группировка по сложному полю. например:
select a, b, (select c from d) as s, count(*)
from f
group by a,b,...
вместо ... нужно подставить сложное поле.
Я пробовал и s, и цифру 3 и просто подставлял выражение (select c from d), но во всех случаях компилятор ругается.
Скажите, пожалуйста, как можно выйти из положения.
9 июл 07, 14:09    [4367548]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Я работаю на оракле 6

Может, на Forms 6 ?
9 июл 07, 14:10    [4367558]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
Да, с Оракл 6 непонятно ...
А по сабжу тоже не вполне понятно.
В скобках у Вас судя по всему находится скалярный подзапрос.
Если так, то преобразуйте его в эквивалентное внешнее соединение

a la

SQL> select sum(sal), (select dname from scott.dept where deptno = e.deptno) as q
  2  from scott.emp e
  3  group by dname
  4  /

select sum(sal), (select dname from scott.dept where deptno = e.deptno) as q
from scott.emp e
group by dname

ORA-00904: "DNAME": ungültiger Bezeichner

SQL> /
SQL> 
SQL> select sum(sal), dname from scott.emp e, scott.dept d
  2  where e.deptno = d.deptno (+)
  3  group by dname
  4  /

  SUM(SAL) DNAME
---------- --------------
     10875 RESEARCH
      9400 SALES
      8750 ACCOUNTING

SQL> 
9 июл 07, 14:19    [4367620]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
PavelX
Здравствуйте, уважаемые программисты.
Я работаю на оракле 6.
Вчера днем возникла казалось бы маленькая проблема, но из-за нее торможу уже полтора дня.
Нужно написать запрос, в котором идет группировка по сложному полю. например:
select a, b, (select c from d) as s, count(*)
from f
group by a,b,...
вместо ... нужно подставить сложное поле.
Я пробовал и s, и цифру 3 и просто подставлял выражение (select c from d), но во всех случаях компилятор ругается.
Скажите, пожалуйста, как можно выйти из положения.

f и d никак не связаны? А то можно было бы так.
select a, b, c, count(*)
from f, d
where f.<поле> = d.<поле>
group by a,b,c
9 июл 07, 14:19    [4367622]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
В порядке бреда технически возможно вот такое:

SQL> select deptno, t.c, count(*)
  2  from dept, (select empno c from emp where rownum = 1) t
  3  group by deptno, t.c
  4  /

    DEPTNO          C   COUNT(*)
---------- ---------- ----------
        20       7369          1
        30       7369          1
        40       7369          1
        10       7369          1

Но какой сермяжный смысл в подзапросе (select c from d) ?
Объясните, плиз, постановку задачи, а то возникают нехорошие предчувствия ;)
9 июл 07, 14:25    [4367662]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
dmidek
Да, с Оракл 6 непонятно ...
А по сабжу тоже не вполне понятно.
В скобках у Вас судя по всему находится скалярный подзапрос.
Если так, то преобразуйте его в эквивалентное внешнее соединение

a la

SQL> select sum(sal), (select dname from scott.dept where deptno = e.deptno) as q
  2  from scott.emp e
  3  group by dname
  4  /

select sum(sal), (select dname from scott.dept where deptno = e.deptno) as q
from scott.emp e
group by dname

ORA-00904: "DNAME": ungültiger Bezeichner

SQL> /
SQL> 
SQL> select sum(sal), dname from scott.emp e, scott.dept d
  2  where e.deptno = d.deptno (+)
  3  group by dname
  4  /

  SUM(SAL) DNAME
---------- --------------
     10875 RESEARCH
      9400 SALES
      8750 ACCOUNTING

SQL> 


Пока суд да дело, пришел в голову другой более принципиальный :-) способ
(я по прежнему думаю, что нам был показан незаконченный
скалярный подзапрос :-) ): обернуть запрос

SQL> select sum(a.sal), a.dname
  2  from
  3  (select e.*, (select dname from scott.dept where deptno = e.deptno) dname 
  4  from scott.emp e) a
  5  group by a.dname
  6  /

SUM(A.SAL) DNAME
---------- --------------
     10875 RESEARCH
      9400 SALES
      8750 ACCOUNTING

SQL> 
9 июл 07, 14:37    [4367734]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
PavelX
Guest
Спасибо большое за участие в решении проблемы.
Да, под select c from d имелся ввиду вложенный подзапрос (subquery).
Теперь я понял, как группировать по такому полю.
10 июл 07, 05:45    [4370221]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
PavelX
Спасибо большое за участие в решении проблемы.
Да, под select c from d имелся ввиду вложенный подзапрос (subquery).
Теперь я понял, как группировать по такому полю.


Наверное все же точнее сказать скалярный подзапрос (scalar sub-query)
10 июл 07, 08:55    [4370364]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
PavelX
Guest
Скалярный - возвращающий одну строку, а не множество.
10 июл 07, 10:16    [4370709]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
PavelX
Скалярный - возвращающий одну строку, а не множество.


Точнее - возвращающий значение одной колонки из одной строки
10 июл 07, 11:23    [4371239]     Ответить | Цитировать Сообщить модератору
 Re: Group By + подзапрос  [new]
Elic
Member

Откуда:
Сообщений: 29980
dmidek
PavelX
Скалярный - возвращающий одну строку, а не множество.
Точнее - возвращающий значение одной колонки из одной строки
Уточнять так уточнять: "не более одной строки с ровно одним столбцом" :)
10 июл 07, 11:33    [4371329]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить