Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 select натуральный ряд  [new]
Ales Protiv
Member

Откуда: Прага
Сообщений: 1872
как одним селектом выбрать ряд натуральных чисел до 1000, например.
5 июн 03, 14:42    [222950]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Delerium
Member

Откуда: Riga, Latvia
Сообщений: 313
create table naturals (a number);

insert ...

select a from naturals;
5 июн 03, 14:57    [222980]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
AI
Member

Откуда: Москва
Сообщений: 2814
select rownum from <Большая таблица, напр, dba_objects>
where rownum<=1000
5 июн 03, 15:09    [223011]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Ales Protiv
Member

Откуда: Прага
Сообщений: 1872
это понятно... я думал, может красивей чего есть...
5 июн 03, 15:19    [223045]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Delerium
Member

Откуда: Riga, Latvia
Сообщений: 313
to Al:
5 июн 03, 16:01    [223133]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Delerium
Member

Откуда: Riga, Latvia
Сообщений: 313
Sorry za pustoi msg.

to Al: jestj tolko 1 tabljica v baze, na katoruju mozhno polozhitsja: Dual

select rownum from dual;

vsegda vernjot tolko "1"

A v dba_objects i drugih tabljicah mozhet menjatsja schjot zapisei :(
5 июн 03, 16:07    [223149]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
AI
Member

Откуда: Москва
Сообщений: 2814
2 Delerium

Можно еще положиться на таблицу dictionary, которая доступна всем и всегда. Dba_objects я давал как пример, а не как окончательное решение. Количество строк тоже не влияет на метод построения запроса. Если строк в таблице не хватает, можно дать декартово произведение.
5 июн 03, 17:10    [223280]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9529
Using dictionary views as Al suggested will cover you in most cases. However, if you want a bulletproof solution use:

SQL> CREATE OR REPLACE
  2    TYPE ANY_SIZE_TABLE_TYPE
  3      AS
  4         TABLE OF NUMBER;
  5  /

Type created.

SQL> CREATE OR REPLACE
  2   FUNCTION ANY_SIZE_TABLE(
  3                            p_TABLE_SIZE IN NUMBER
  4                           )
  5      RETURN ANY_SIZE_TABLE_TYPE
  6      IS
  7          v_TBL ANY_SIZE_TABLE_TYPE := ANY_SIZE_TABLE_TYPE();
  8      BEGIN
  9          v_TBL.EXTEND(p_TABLE_SIZE);
 10          RETURN v_TBL;
 11  END;
 12  /

Function created.

SQL> SELECT ROWNUM FROM TABLE(CAST(ANY_SIZE_TABLE(1000) AS ANY_SIZE_TABLE_TYPE))
  2  /

    ROWNUM
----------

         1
         2
         3
         4
         .
         .
         .
      1000

SY
5 июн 03, 17:40    [223332]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Violina
Member

Откуда: Санкт-Петербург
Сообщений: 3662
Что меня заинтересовало в этом топике так это для чего такое может быть нужно? :-)
5 июн 03, 17:58    [223367]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
AndrewS
Member

Откуда: Минск
Сообщений: 487
Или так (для 9i):
create or replace type ttbl_number is table of number;
/

create or replace package p as
function Pivot( p_cnt int) return ttbl_number pipelined;
end;
/

create or replace package body p as
function Pivot( p_cnt int) return ttbl_number
pipelined
is
begin
	for i in 1..p_cnt loop
		pipe row(i);
	end loop;
	return;
end Pivot;
end p;
/

select rownum from table( p.pivot(1000));
5 июн 03, 18:05    [223388]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Тут даже собственно понятие существует, т.н. Pivot Tables. Рассматриваются тут: http://otn.oracle.com/oramag/oracle/02-sep/o52sql.html
5 июн 03, 18:07    [223394]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
AI
Member

Откуда: Москва
Сообщений: 2814
2 Violina

Такая методика используется не только для чисел, но и для наборов дат. Например, надо быстро вставить все даты за определенный период.
5 июн 03, 18:08    [223396]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9529
2 AndrewS:

I understand that pipelined function can give performance advantage when calling functions returning table type since it returns a row at a time in an asynchronous way. However, in this particular case, using pipelined function, in my opinion, does not have any advantage and even in opposite can take more time to execute. Solution I posted simply extends nested table to desired number of elements and it is done once versus N iteration loop in pipelined function solution.

SY
5 июн 03, 18:34    [223431]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9529
I just did a little test (note that in 9i you do not need to CAST while in 8i you do):

set timing on
set termout off
spool c:\temp\xxx.log
select rownum from table(p.pivot(100000));
SELECT ROWNUM FROM TABLE(ANY_SIZE_TABLE(100000)) -- no need to CAST

/
spool off

Results were:
100000 rows selected.

Elapsed: 00:00:06.05

100000 rows selected.

Elapsed: 00:00:06.01

SY
5 июн 03, 18:52    [223447]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
AndrewS
Member

Откуда: Минск
Сообщений: 487
2SY:
А если б я подождал с постом минуты 3, то можно просто было бы сходить по ссылке на oracle.com и не изобретать велосипед! :)
5 июн 03, 19:01    [223457]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: select натуральный ряд  [new]
Червов
Member

Откуда:
Сообщений: 48
Можно извратится в 8i

SELECT ROWNUM
FROM (SELECT 1
FROM DUAL
GROUP BY CUBE (1, 1, 1))

кол-во единиц в опции CUBE - степень двойки: столько получишь записей.
10 ноя 04, 14:55    [1095040]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
В последнем русском Oracle Magazine статья Тома Кайта в тему про "разреженные внешние объединения"
10 ноя 04, 15:30    [1095265]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Димитрий_Галин
Member

Откуда: Харьков
Сообщений: 102
Червов
Можно извратится в 8i

SELECT ROWNUM
FROM (SELECT 1
FROM DUAL
GROUP BY CUBE (1, 1, 1))

кол-во единиц в опции CUBE - степень двойки: столько получишь записей.

select ROWNUM
  from (select   1
            from DUAL
        group by cube (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                       1, 1, 1, 1, 1, 1, 1, 1))
остановлен на 22 МИНУТЕ
10 ноя 04, 21:39    [1096523]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
chervov
Guest
Ну само собой.

2 в 10-ой уже секунду считается, а ты в 26 захотел.
Это годится для небольших последовательностей, и желательно не в составе вьюшек.
11 ноя 04, 16:08    [1099114]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Эстет
Guest
2Червов
Респект:) Красивая конструкция...
14 дек 04, 06:34    [1178408]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
osse
Member

Откуда: Н-ск
Сообщений: 162
Присоединяюсь :-)
14 дек 04, 07:16    [1178434]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Червов

SELECT ROWNUM
  FROM (SELECT   1
            FROM DUAL
        GROUP BY CUBE (1, 1, 1))

Вспомнилась мне эта давняя тема. Видел когда-то это хитрое решение, но позже про него забыл, а недавно сам написал нечто схожее, но без вложенных SELECT-ов:
select distinct(group_id()) + 1
 from dual
 group by cube(1,1,1,1,1);
По производительности идентичен исходному.
Правда, возвращает не 2^n записей, а 2^n - 1.
2 фев 05, 21:11    [1295619]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
RRA
Member

Откуда:
Сообщений: 42
Select  
*
From
(Select
Level As Число
From
(Select 0 from Dual Minus
Select 1 from Dual)
Connect By Level<=1000000) A1
Where
A1.Число Between 999990 And 1000000
7 июл 05, 14:49    [1684564]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
RnR
Member

Откуда: Moscow
Сообщений: 151
RRA
Select  
*
From
(Select
Level As Число
From
(Select 0 from Dual Minus
Select 1 from Dual)
Connect By Level<=1000000) A1
Where
A1.Число Between 999990 And 1000000


Ну или проще:

SELECT * FROM (SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 101)
7 июл 05, 14:58    [1684633]     Ответить | Цитировать Сообщить модератору
 Re: select натуральный ряд  [new]
XCB
Member

Откуда:
Сообщений: 726
RnR

Ну или проще:

SELECT * FROM (SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 101)

можно и только внутренний
7 июл 05, 15:23    [1684799]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить