створити додатковий номер у запиті 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.