Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каждой группе записей надо сопоставить одно значение sequence в select / 11 сообщений из 11, страница 1 из 1
07.12.2020, 15:48
    #40025305
AnnitaBells
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
Пыталась через дистинкт уникальный идентификатор группы, оборачиваем в селект и сопоставляем сиквенс. Одно это прекрасно работает. Но затем пытаюсь сделать подзапрос и соединить по идентификатору группы с основным запросом, ругается на то, что сиквенсы здесь не разрешены.
Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
07.12.2020, 15:54
    #40025309
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
AnnitaBells
Пыталась через дистинкт уникальный идентификатор группы, оборачиваем в селект и сопоставляем сиквенс. Одно это прекрасно работает. Но затем пытаюсь сделать подзапрос и соединить по идентификатору группы с основным запросом, ругается на то, что сиквенсы здесь не разрешены.
Подскажите, пожалуйста.
покажите запрос
...
Рейтинг: 0 / 0
07.12.2020, 16:13
    #40025318
AnnitaBells
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
andreymx,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create SEQUENCE t_seq start with 1;

with t as (select * from (select 1 num, 1 grp from dual
union all
select 11 num, 1 grp from dual
union all
select 12 num, 2 grp from dual
union all
select 1212 num, 2 grp from dual
union all
select 111 num, 2 grp from dual
union all
select 12 num, 3 grp from dual
union all
select 1212 num, 3 grp from dual
union all
select 111 num, 3 grp from dual
))
select t1.grp, t_seq.nextval from (select distinct t.grp from t) t1



работает.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as (select * from (select 1 num, 1 grp from dual
union all
select 11 num, 1 grp from dual
union all
select 12 num, 2 grp from dual
union all
select 1212 num, 2 grp from dual
union all
select 111 num, 2 grp from dual
union all
select 12 num, 3 grp from dual
union all
select 1212 num, 3 grp from dual
union all
select 111 num, 3 grp from dual
)),
t2 as (select t1.grp, t_seq.nextval nv from (select distinct t.grp from t) t1)
select t.*,t2.* from t, t2 where t.grp = t2.grp



Error report -
SQL Error: ORA-02287: sequence number not allowed here
02287. 00000 - "sequence number not allowed here"
*Cause: The specified sequence number (CURRVAL or NEXTVAL) is inappropriate
here in the statement.
*Action: Remove the sequence number.
...
Рейтинг: 0 / 0
07.12.2020, 16:26
    #40025325
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
Поменяйте t_seq.nextval на row_number()
...
Рейтинг: 0 / 0
07.12.2020, 16:28
    #40025327
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
AnnitaBells,

Это документированное поведение
дока You cannot use CURRVAL and NEXTVAL in the following constructs:

A subquery in a DELETE, SELECT, or UPDATE statement

A query of a view or of a materialized view

A SELECT statement with the DISTINCT operator

A SELECT statement with a GROUP BY clause or ORDER BY clause

A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator

The WHERE clause of a SELECT statement

The condition of a CHECK constraint

В данном случае сиквенс легко заменяется row_number() over(order by null)


p.s. ну и оставлю тут ссылку на умного человека , думаю, ещё акутально
...
Рейтинг: 0 / 0
07.12.2020, 16:34
    #40025329
AnnitaBells
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
env,

andreymx
Поменяйте t_seq.nextval на row_number()


Проблема в том, что в реальном проекте надо использовать именно данный конкретный сиквенс.
...
Рейтинг: 0 / 0
07.12.2020, 16:45
    #40025336
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
AnnitaBells,

Тогда делайте с предварительной материализацией связки в таблицу.
...
Рейтинг: 0 / 0
07.12.2020, 16:57
    #40025343
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
AnnitaBells
env,

andreymx
Поменяйте t_seq.nextval на row_number()


Проблема в том, что в реальном проекте надо использовать именно данный конкретный сиквенс.

последовательность в функцию



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> with t as (
  2  select s.nextval,deptno from (select distinct deptno from emp) t)
  3  select * from t
  4  /
select s.nextval,deptno from (select distinct deptno from emp) t)
         *
ERROR at line 2:
ORA-02287: sequence number not allowed here


SQL> create or replace function stax_sq return number is begin return s.nextval;end;
  2  /

Function created.


SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  select stax_sq(),deptno from (select distinct deptno from emp) t)
  3* select * from t
SQL> /

 STAX_SQ()     DEPTNO
---------- ----------
       282         30
       283         20
       284         10

SQL>




зі
есть нюансы, надеюсь Вам не нужны
......
stax
...
Рейтинг: 0 / 0
07.12.2020, 17:04
    #40025349
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
Stax

есть нюансы


И еще какие :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
create or replace function stax_sq return number is begin return seq.nextval; end;
/
with t as (
           select stax_sq() seq,deptno from (select distinct deptno from emp) t
           )
select  t.seq,
        e.deptno,
        e.ename
  from  emp e,
        t
  where e.deptno = t.deptno
/

       SEQ     DEPTNO ENAME
---------- ---------- ----------
        98         20 ADAMS
        99         30 JAMES
       100         10 MILLER
       101         20 SMITH
       102         30 WARD
       103         10 KING
       104         30 BLAKE
       105         10 CLARK
       106         30 TURNER
       107         30 ALLEN
       108         20 JONES
       109         30 MARTIN
       110         20 SCOTT
       111         20 FORD

14 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
07.12.2020, 17:49
    #40025364
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
SY,

ет фигня, материализовать

напр
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> set pages 50000
SQL> l
  1  with t as (
  2             select distinct stax_sq() seq,deptno from (select distinct deptno from emp) t
  3             )
  4  select  t.seq,
  5          e.deptno,
  6          e.ename
  7    from  emp e,
  8          t
  9*   where e.deptno = t.deptno
SQL> /

       SEQ     DEPTNO ENAME
---------- ---------- ----------
       305         30 ALLEN
       305         30 WARD
       305         30 MARTIN
       305         30 BLAKE
       305         30 TURNER
       305         30 JAMES
       307         10 CLARK
       307         10 KING
       307         10 MILLER
       306         20 SMITH
       306         20 JONES
       306         20 SCOTT
       306         20 ADAMS
       306         20 FORD

14 rows selected.

SQL>




.......
stax
...
Рейтинг: 0 / 0
07.12.2020, 18:47
    #40025381
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каждой группе записей надо сопоставить одно значение sequence в select
всё-таки интересно, какую задачу решает коллега AnnitaBells
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каждой группе записей надо сопоставить одно значение sequence в select / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]