створити додатковий номер у запиті Oracle sql


13

як створити додатковий номер у запиті Oracle sql без створення будь-якої таблиці? Я спробував використовувати пункт "з", але не зміг отримати очікуваний результат. Я використовую Oracle 10г

ось код, який я намагаюся, він, здається, не працює:

WITH
TABLE3 AS ( SELECT 2008 YEARS FROM dual WHERE 1=1
union all
select t3.YEARS+1 from TABLE3 t3
WHERE 1=1 AND t3.YEARS < 2011
)

select YEARS from TABLE3

очікуваний результат, якого я хочу:

2008
2009
2010
2011

Відповіді:


14

Схожий на відповідь Керрі, але без with(і натхненний відповіддю ТА ):

SELECT 2007 + LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4;

     YEARS
----------
      2008
      2009
      2010
      2011

Або якщо ваша мета - отримати поточний рік три, що передували йому, без жорсткого кодування початкового року:

SELECT EXTRACT(YEAR FROM SYSDATE) + 1 - LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4
ORDER BY YEARS;

1
Я думаю, що я
— підберу

16

Я думаю, що це спрацює (на основі цієї сторінки ( http://psoug.org/definition/LEVEL.htm ) як відправна точка):

WITH counter
AS ( SELECT LEVEL seq
       FROM DUAL
     CONNECT BY LEVEL <= 4 )
SELECT (2008 + seq - 1) myYear
  FROM counter
 ORDER BY 1
;

Це має повернути:

myYear
------
  2008
  2009
  2010
  2011

Налаштуйте 2008 та 4, щоб отримати різні результати.


5

Схоже, що ОП намагалася вирішити проблему за допомогою рекурсивного підзапиту. Це не працюватиме в 10 г, оскільки ця функціональність не була додана до 11.2, але в 11.2+ наступне також буде коректним рішенням проблеми.

WITH T3(Years) AS (
   SELECT 2008 Years FROM dual
   UNION ALL
   SELECT Years + 1 FROM T3 WHERE Years < 2011
   )
SELECT * FROM T3;

Єдине, чого бракувало в запиті ОП (YEARS).


трохи змінене працює і в MS SQL WITH T3(Years) AS ( SELECT 2008 Years UNION ALL SELECT Years + 1 FROM T3 WHERE Years < 2011 ) SELECT * FROM T3;
— чудо173,

@ чудо173 Цікаво, просто видаліть FROM dual.
— Лі Ріффер

dualце специфічна таблиця для оракула. Інші бази даних, такі як MS SQL Sever, mysql, postgres, дозволяють такі операції, як select expression. mysql теж знає подвійну таблицю
— miracle173

4

Чому б просто не створити послідовність?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

Редагувати:

Для невеликих діапазонів значень послідовностей ви можете використовувати щось подібне:

select ROWNUM + 10   # start value
from ALL_OBJECTS 
where ROWNUM <= 5 ;  # count of values 

Вам просто потрібна таблиця з достатньою кількістю рядків.


3
Здається, що накладні витрати на щось настільки тривіальне, і DDL зробить неявну фіксацію, чого, можливо, не слід очікувати. І користувач, який видає запит, може не мати дозволу на створення послідовності.
— Алекс Пул

Я згоден з Алексом Пулом, але все-таки, це все-таки інше вирішення подяки
— 50LV3R

-1 з причин @AlexPoole заявив. якщо повторно виконати запит, не відтворюючи послідовність, ви отримаєте інший результат.
— чудо173

запит, який використовує послідовність, не повертає потрібний набір чисел.
— чудо173

-1

Ось приклад додавання декількох прапорців та збільшення їх на основі заяви справи.

WITH T3(FLAG1,FLAG2,FLAG3,tt,OTHER_DATA)  
AS (    
SELECT '0' FLAG1, '0' FLAG2, '0' FLAG3 , current_timestamp  tt , 'dummy'  OTHER_DATA 
FROM dual 
UNION ALL  
SELECT case when cast( FLAG2 as int) > 5 then
cast ((cast(FLAG1 as int) + 1) as varchar2(30)) else  FLAG1 end FLAG1,
cast((cast(FLAG2 as int) + 1) as varchar2(30)) FLAG2  ,case when (
(FLAG2 ='3') or (FLAG2 = '4')) then cast ((cast(  FLAG3 as int) + 1)
as varchar2(30)) else FLAG3 end FLAG3  ,current_timestamp  tt ,
'ACTUAL' OTHER_DATA FROM T3 WHERE FLAG2 < 10   
)
SELECT * FROM T3
WHERE OTHER_DATA != 'dummy' ;

- Набір результатів нижче

Flag1   Flag2   Flag3   TT                                              OTHER_DATA
0       1       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       2       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       3       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       4       1       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       5       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       6       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
1       7       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
2       8       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
3       9       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
4      10       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL   

2
Чому весь кастинг між рядками та числами? Не зовсім впевнений, що це додає до наявних відповідей, оскільки це не те, що ОП здавалося, що шукає.
— Алекс Пул

-1

Збільшити лише в одному з роунумом вибору роунума + 100 із порядку "стіл" на 1;

Цей результат із 101, 102 і т.д.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.