powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синтаксис какой СУБД?
25 сообщений из 25, страница 1 из 1
Синтаксис какой СУБД?
    #39945274
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Есть код SQL:
Код: plsql
1.
2.
3.
4.
5.
create table D_TEST ( id number(17), numb number(10) ) 
alter table D_TEST 
add constraint PK_D_TEST primary key (ID); 
alter table D_TEST 
add constraint UK_D_TEST_N unique (NUMB);



Подскажите, правильно ли я понимаю, что этот код oracle?

Помогите решить задачу:
Одним запросом необходимо получить минимальный свободный (отсутствующий) номер (NUMB), но не менее минимального занятого (существующего) номера. Если нет ни одной записи в таблице, запрос должен вернуть значение 1.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945312
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum,

поиск на сайте по слову "дырка"

....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945318
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, что это значит?
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945323
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum
Stax, что это значит?


https://www.sql.ru/forum/actualsearch.aspx?search=?????&sin=0&bid=3&a=&ma=0&dt=-1&s=1&so=1

ps
счас немножко занят, освобожусь попробую нарисовать

....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945336
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, не сразу про дырки понял))
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945366
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum,

если нет свободных то , запрос должен вернуть ... ?

....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945420
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum,

если нет свободных то 0


rownum/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.
with d_test(numb) as (
--/*
select 5 from dual union all
select 6 from dual union all
--select 7 from dual union all
select 8 from dual union all
select 9 from dual union all
--select 10 from dual union all
select 11 from dual union all
--*/
select 12 from dual where 1=2)
, t as (select numb,numb-row_number() over (order by numb) g from d_test)
select 
  case 
   when min(max(numb)) is null then 1
   when min(min(g))+sum(count(*))=max(max(numb)) then 0
   else min(max(numb))+1
   end d
from t
group by g
SQL> /

         D
----------
         7



lead
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> with d_test(numb) as (
  2  --/*
  3  select 5 from dual union all
  4  select 6 from dual union all
  5  --select 7 from dual union all
  6  select 8 from dual union all
  7  select 9 from dual union all
  8  --*/
  9  select 10 from dual where 1=2)
 10  , t as (select numb,lead(numb,1,numb-1) over (order by numb) le from d_test)
 11  , tt as (
 12  select
 13    min(numb) mn
 14   ,min(le) KEEP (DENSE_RANK FIRST ORDER BY null) l
 15  from t where numb<>le-1)
 16  select decode(mn,null,1,l+1,0 /*mn+1*/,mn+1) d from tt
 17  /

         D
----------
         7



зы
+
match_recognize, model, ...

....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945425
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
если нет свободных то 0
То max+1. Неужели бритва Оккама так сложна в здравомыслии?
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945463
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

match_recognize


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select  nvl(max(hole),1) hole
  from  t
  match_recognize(
                  order by n
                  measures
                    last(no_gap.n) + 1 hole
                  pattern(no_gap+ gap*)
                 define no_gap as n = nvl(prev(n) + 1,n) and match_number() = 1,
                        gap as n != prev(n) + 1 and match_number() = 1
                 )
/



SY.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945479
Фотография 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.
with d_test(numb) as (
--/*
select 5 from dual union all
select 6 from dual union all
--select 7 from dual union all
select 8 from dual union all
select 9 from dual union all
--select 10 from dual union all
select 11 from dual union all
--*/
select 12 from dual where 1=2)
select nvl(min(n)+1,1) nn 
from d_test  
  match_recognize(
  order by numb
  measures
      strt.numb n
      ,match_number() m
   pattern(strt d |strt$)
   define d as numb <> strt.numb+1 --and match_number()=1
   )
   where m = 1
/



ps
мож match_number()=1 можно как то красивее/оптимальнее заюзать

....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945491
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

добавил
strt as match_number()=1

Код: 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.
with d_test(numb) as (
--/*
select 5 from dual union all
select 6 from dual union all
--select 7 from dual union all
select 8 from dual union all
select 9 from dual union all
--select 10 from dual union all
select 11 from dual union all
select 12 from dual union all
--*/
select 12 from dual where 1=2)
select nvl(max(n)+1,1) nn 
from d_test  
  match_recognize(
  order by numb
  measures
      strt.numb n
      --,d.numb dd
      ,match_number() m
   pattern(strt d |strt$)
   define 
       strt as match_number()=1
      ,d as numb <> strt.numb+1 and match_number()=1
   )



....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945504
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

перебор с match_number()=1

Код: plsql
1.
2.
3.
   define 
       strt as match_number()=1
      ,d as numb <> strt.numb+1 



.....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945544
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое!
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945545
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SY,

так не проще?
Вы бы оба не позорились.
Казалось бы зачем натягивать агрегат на match_recognize.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945546
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег

Казалось бы зачем натягивать агрегат на match_recognize.


Если нет ни одной записи в таблице, запрос должен вернуть значение 1.

SY.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945652
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

Код: plsql
1.
pattern(strt d |strt$)

Так под шаблон попадает либо 1 либо 2 строки что меньше чем в альтернативном решении,
но в любом случае будут прочитаны все строки и будут отсортированы все строки таблицы.
Даже если на столбце есть уникальный индекс это может дать MATCH RECOGNIZE BUFFER вместо MATCH RECOGNIZE SORT, но профита особого от этого нет.
SY
Кобанчег

Казалось бы зачем натягивать агрегат на match_recognize.


Если нет ни одной записи в таблице, запрос должен вернуть значение 1.

SY.
Согласен, так имеет смысл. В select nvl() from dual особой необходимости нет.
Тем более что парсер подглючивает когда match_recognize в скаляре.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select (select * from dual match_recognize (measures 1 x pattern(p+) define p as 1=1)) x from dual;

         X
----------
         1

SQL> select (select * from dual match_recognize (measures 1 x pattern(p?) define p as 1=1)) x from dual;
select (select * from dual match_recognize (measures 1 x pattern(p?) define p as 1=1)) x from dual
                                                                  *
ERROR at line 1:
ORA-00911: invalid character

...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945669
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
Stax

Код: plsql
1.
pattern(strt d |strt$)

Так под шаблон попадает либо 1 либо 2 строки что меньше чем в альтернативном решении,
но в любом случае будут прочитаны все строки и будут отсортированы все строки таблицы.
Даже если на столбце есть уникальный индекс это может дать MATCH RECOGNIZE BUFFER вместо MATCH RECOGNIZE SORT, но профита особого от этого нет.
Ну и главное касательно match_recognize - не надо матчить то, что не нужно.
Более того, в этом случае это позволяет избавиться от backtracking.
Соответственно получаем MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON
(или MATCH RECOGNIZE BUFFER DETERMINISTIC FINITE AUTOMATON при наличии нужного индекса)
вместо MATCH RECOGNIZE SORT.
Для этой задачи кроме более красивого плана, впрочем, особого профита опять же нет.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select nvl(max(hole+1),1) hole
from d_test  
match_recognize
(
  order by numb
  measures numb as hole
  pattern(x+)
  define x as numb = nvl(prev(numb)+1,numb) and match_number() = 1
)


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-------------------------------------------------------------------
| Id  | Operation                                        | Name   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT                                 |        |
|   1 |  SORT AGGREGATE                                  |        |
|   2 |   VIEW                                           |        |
|   3 |    MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTO|        |
|   4 |     TABLE ACCESS FULL                            | D_TEST |
-------------------------------------------------------------------
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945679
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые спецы, прокомментируйте пожалуйста ваш код поподробнее, какую теорию нужно изучить?
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945853
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum
Уважаемые спецы, прокомментируйте пожалуйста ваш код поподробнее, какую теорию нужно изучить?
Какие затруднения вызывает ввести нужные ключевые слова в поиск?

Конкретно для твоей задачи ничего изучать не надо - достаточно понять самое простое решение 22071163 .
Которое к тому же самое эффективное.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945865
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
достаточно понять самое простое решение 22071163 .
Которое к тому же самое эффективное.


допиливать надо

ps
насчет самое эффективное, возможно ето зависит и от обьемов и от положения дырки

....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945894
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
допиливать надо
Да, в той теме была минимальная граница а тут ее нет.
Странно почему на таком тривиальном изменении делается акцент.
Ты исходишь из допущения что адресат является имбецилом не в состоянии внести изменения в 5 строчек кода?
Stax
насчет самое эффективное, возможно ето зависит и от обьемов и от положения дырки
В таких случаях можно искать с конца а не с начала... или одновременно.
И перейти от cursor for loop к bulk fetch с отрегулированным размером пачки.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945904
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег,

исходил из

автор Конкретно для твоей задачи ничего изучать не надо - достаточно понять самое простое решение



конкретно для даной задачи надо допилить
1) пустая таблица
2) нет дырки (что вернуть?)

тоесть
не достаточно понять, но надо и допилить

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



.....
stax
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945912
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
нет дырки (что вернуть?)
Ты тут ввязался решать непосильнейшую охренительнейшую мегазадачу, которую у тебя никто никогда ни разу не спрашивал, а, тем более, даже не пытался решать. И у тебя есть решение для него, но бац - какая-то неприятная засада - дырок-то может не быть. И тут впору открывать НИР...
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39945950
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
конкретно для даной задачи надо допилить
1) пустая таблица
2) нет дырки (что вернуть?)
Не надо ничего никуда пилить.
Есть проход по курсору с конкретным условием прерывания и в определенном порядке и есть возврат результата. Всё.
Обычно хорошим стилем программирования считается когда в функции есть только одна точка выхода.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function get_hole return int is
  prev int;
begin
  for i in (select rownum rn, numb n from d_test order by numb) loop
    if i.n - prev > 1 then exit; end if;
    prev := i.n;
  end loop;
  return nvl(prev, 0) + 1;
end get_hole;

В решении НЕ важно есть ли дырка или нет.
Для пустой таблицы добавлено nvl.
Это требует по-твоему дополнительных замечаний?

В твоем случае, к сожалению, доходит до маразма.
Даже если решение на форуме было дано 100 раз и тут появляется вопрошающий у которого другое название таблицы или колонок ты не можешь удержатьяся от соблазна родить 101-й дубль.

Это наводит на мысль, что ты относишься к вопрошающим как к умственно отсталым неспособным на самую примитивную умственную деятельность.
Stax
они вышли за сугубо медицинские рамки
Ты всё правильно понял.

PS.
Stax
эффективное, возможно ето
Возможно, стоит научится писать "это" с правильной буквы раз уж она у тебя есть на кливиатуре и ты даже используешь её в других словах.
...
Рейтинг: 0 / 0
Синтаксис какой СУБД?
    #39946121
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за это решение, буду разбираться!

Кобанчег

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function get_hole return int is
  prev int;
begin
  for i in (select rownum rn, numb n from d_test order by numb) loop
    if i.n - prev > 1 then exit; end if;
    prev := i.n;
  end loop;
  return nvl(prev, 0) + 1;
end get_hole;

...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синтаксис какой СУБД?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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