oracle sql sorgusunda artımlı sayı yarat


13

herhangi bir tablo oluşturmadan oracle sql sorgusunda artımlı sayı nasıl oluşturulur? "With" yan tümcesini kullanmayı denedim, ancak beklenen sonucu alamadım. Oracle 10g kullanıyorum

İşte denediğim kod, çalışmıyor gibi görünüyor:

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

İstediğim sonuç:

2008
2009
2010
2011

Yanıtlar:


14

Kerri'nin cevabına benzer, ancak with(ve bir SO cevabından esinlenerek ):

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

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

Ya da hedefiniz başlangıç ​​yılını zor kodlamadan cari yıla ondan önceki üçünü almaksa:

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

1
i kodum için bu bir seçeceğini düşünüyorum, onun kullanmaktan çok daha basit yan tümce ile
50LV3R

16

Ben düşünüyorum (bu sayfada (dayalı bu irade işi http://psoug.org/definition/LEVEL.htm bir başlangıç noktası olarak)):

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

Bu geri dönmelidir:

myYear
------
  2008
  2009
  2010
  2011

Farklı sonuçlar elde etmek için 2008 ve 4'ü ayarlayın.


5

OP'nin özyinelemeli bir alt sorgu kullanarak sorunu çözmeye çalıştığı anlaşılıyor. Bu, 10g'de çalışmaz, çünkü bu işlevsellik 11.2'ye kadar eklenmemiştir, ancak 11.2+'da aşağıdakiler de soruna geçerli bir çözüm olacaktır.

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

OP sorgusunda eksik olan tek şey (YEARS).


MS SQL'de de biraz değiştirilmiş çalışmalar WITH T3(Years) AS ( SELECT 2008 Years UNION ALL SELECT Years + 1 FROM T3 WHERE Years < 2011 ) SELECT * FROM T3;
miracle173

@ miracle173 İlginç, sadece kaldırın FROM dual.
Leigh Riffel

dualkehanete özgü bir tablodur. MS SQL Sever, mysql, postgres gibi diğer veritabanları gibi ifadelere izin verir select expression. mysql çift tabloyu da biliyor
miracle173

4

Neden sadece bir dizi oluşturmuyorsunuz?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

DÜZENLE:

Küçük dizi değerleri aralıkları için şöyle bir şey kullanabilirsiniz:

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

Sadece yeterli sayıda satıra sahip bir tabloya ihtiyacınız var.


3
Bu kadar önemsiz bir şey için çok fazla ek yük gibi görünüyor ve DDL beklenmedik bir örtük taahhütte bulunacak. Ve sorguyu yayınlayan kullanıcının bir sekans oluşturma izni olmayabilir.
Alex Poole

Alex Poole ile katılıyorum, ama yine de, yine de başka bir çözüm teşekkürler
50LV3R

@AlexPoole için belirtilen nedenlerden dolayı -1. diziyi yeniden oluşturmadan sorguyu yeniden uygularsanız farklı bir sonuç elde edersiniz.
miracle173

diziyi kullanan sorgu istenen sayı kümesini döndürmez.
miracle173

-1

Aşağıda, vaka ifadesine dayalı olarak birden çok bayrak ekleme ve artırmaya bir örnek verilmiştir.

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' ;

- Sonuç kümesi aşağıda

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
Neden dizeler ve sayılar arasındaki tüm döküm? OP'nin aradığı bir şey olmadığı için mevcut cevaplara ne eklediğinden tam olarak emin değilim.
Alex Poole

-1

Sadece rownum select rownum + 100 ile "table" sırasından 1 artırın;

Bu sonuç 101, 102 vb.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.