powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каждой группе записей надо сопоставить одно значение sequence в select
11 сообщений из 11, страница 1 из 1
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025305
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пыталась через дистинкт уникальный идентификатор группы, оборачиваем в селект и сопоставляем сиквенс. Одно это прекрасно работает. Но затем пытаюсь сделать подзапрос и соединить по идентификатору группы с основным запросом, ругается на то, что сиквенсы здесь не разрешены.
Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025309
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnitaBells
Пыталась через дистинкт уникальный идентификатор группы, оборачиваем в селект и сопоставляем сиквенс. Одно это прекрасно работает. Но затем пытаюсь сделать подзапрос и соединить по идентификатору группы с основным запросом, ругается на то, что сиквенсы здесь не разрешены.
Подскажите, пожалуйста.
покажите запрос
...
Рейтинг: 0 / 0
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025318
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025325
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменяйте t_seq.nextval на row_number()
...
Рейтинг: 0 / 0
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025327
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025329
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

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


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

Тогда делайте с предварительной материализацией связки в таблицу.
...
Рейтинг: 0 / 0
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025343
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025349
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025364
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Каждой группе записей надо сопоставить одно значение sequence в select
    #40025381
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё-таки интересно, какую задачу решает коллега AnnitaBells
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каждой группе записей надо сопоставить одно значение sequence в select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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