tạo số gia tăng trong truy vấn sql oracle


13

Làm thế nào để tạo số tăng trong truy vấn sql oracle mà không tạo bảng nào? Tôi đã thử sử dụng mệnh đề "with", nhưng tôi không nhận được kết quả như mong đợi. Tôi đang sử dụng orc 10g

Đây là mã mà tôi thử, có vẻ như không hoạt động:

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

kết quả mong đợi tôi muốn là:

2008
2009
2010
2011

Câu trả lời:


14

Tương tự như câu trả lời của Kerri, nhưng không có with(và lấy cảm hứng từ câu trả lời SO ):

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

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

Hoặc nếu mục tiêu của bạn là lấy năm hiện tại trước ba năm mà không cần mã hóa cứng trong năm bắt đầu:

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

1
Tôi nghĩ rằng tôi sẽ chọn mã này cho mã của mình, nó đơn giản hơn nhiều so với sử dụng mệnh đề With
50LV3R

16

Tôi nghĩ rằng điều này sẽ hoạt động (dựa trên trang này ( http://psoug.org/def định /LEVEL.htm ) làm điểm bắt đầu):

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

Điều này sẽ trở lại:

myYear
------
  2008
  2009
  2010
  2011

Điều chỉnh 2008 và 4 để có kết quả khác nhau.


5

Có vẻ như OP đã cố gắng giải quyết vấn đề bằng cách sử dụng truy vấn con đệ quy. Điều này sẽ không hoạt động trong 10g vì chức năng đó không được thêm vào ngày 11.2, nhưng trong 11.2+ sau đây cũng sẽ là một giải pháp hợp lệ cho vấn đề.

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

Điều duy nhất còn thiếu trong truy vấn của OP là (YEARS).


cũng được sửa đổi một chút trong MS SQL WITH T3(Years) AS ( SELECT 2008 Years UNION ALL SELECT Years + 1 FROM T3 WHERE Years < 2011 ) SELECT * FROM T3;
miracle173

@ miracle173 Thú vị, chỉ cần loại bỏ FROM dual.
Leigh Riffel

duallà một bảng cụ thể orory. Các cơ sở dữ liệu khác như MS SQL Sever, mysql, postgres cho phép các câu lệnh như select expression. mysql cũng biết một bảng kép
miracle173

4

Tại sao không chỉ tạo một chuỗi?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

BIÊN TẬP:

Đối với phạm vi nhỏ của các giá trị chuỗi, bạn có thể sử dụng một cái gì đó như thế này:

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

Bạn chỉ cần một bảng có đủ số lượng hàng.


3
Có vẻ như rất nhiều chi phí cho một cái gì đó quá tầm thường và DDL sẽ thực hiện một cam kết ngầm có thể không được mong đợi. Và người dùng đưa ra truy vấn có thể không có quyền tạo một chuỗi.
Alex Poole

Tôi đồng ý với Alex Poole, nhưng dù sao, đó cũng là một cách giải quyết khác cảm ơn
50LV3R

-1 vì những lý do @AlexPoole đã nêu. nếu bạn xem lại truy vấn mà không tạo lại chuỗi bạn sẽ nhận được kết quả khác.
phép lạ173

truy vấn sử dụng chuỗi không trả về bộ số mong muốn.
phép lạ173

-1

Dưới đây là một ví dụ về việc thêm nhiều cờ và tăng dựa trên câu lệnh tình huống.

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

- Tập kết quả bên dưới

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
Tại sao tất cả các đúc giữa chuỗi và số? Không hoàn toàn chắc chắn những gì điều này thêm vào các câu trả lời hiện có vì đó không phải là điều mà OP dường như đang tìm kiếm.
Alex Poole

-1

Chỉ tăng trong một với rownum chọn rownum + 100 từ thứ tự "bảng" bằng 1;

Kết quả đó với 101, 102, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.