สร้างจำนวนที่เพิ่มขึ้นในแบบสอบถาม Oracle oracle


13

วิธีการสร้างจำนวนที่เพิ่มขึ้นในแบบสอบถาม Oracle oracle โดยไม่ต้องสร้างตารางใด ๆ ? ฉันได้ลองใช้ประโยค "with" แต่ฉันไม่สามารถได้ผลลัพธ์ตามที่คาดหวัง ฉันใช้ oracle 10g

นี่คือรหัสที่ฉันลองใช้ดูเหมือนว่าจะไม่ทำงาน:

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

คล้ายกับคำตอบของ Kerri แต่ไม่มีwith(และได้รับแรงบันดาลใจจากคำตอบ SO ):

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
ฉันคิดว่าฉันจะเลือกรหัสนี้สำหรับรหัสของฉันมันง่ายกว่าการใช้ With clause
50LV3R

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

ดูเหมือนว่า OP พยายามแก้ไขปัญหาโดยใช้แบบสอบถามย่อยแบบเรียกซ้ำ สิ่งนี้จะไม่ทำงานใน 10g เพราะฟังก์ชั่นนั้นไม่ได้เพิ่มจนถึง 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;

สิ่งเดียวที่ขาดหายไปจากการสอบถาม OP (YEARS)ก็คือ


แก้ไขงานเล็กน้อยใน MS SQL ด้วย WITH T3(Years) AS ( SELECT 2008 Years UNION ALL SELECT Years + 1 FROM T3 WHERE Years < 2011 ) SELECT * FROM T3;
miracle173

@ miracle173 FROM dualที่น่าสนใจเพียงแค่ลบ
Leigh Riffel

dualเป็นตารางเฉพาะ oracle ฐานข้อมูลอื่น ๆ เช่น 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 จะกระทำโดยปริยายซึ่งอาจไม่คาดคิด และผู้ใช้ที่ออกแบบสอบถามอาจไม่มีสิทธิ์สร้างลำดับ
Alex Poole

ฉันเห็นด้วยกับ Alex Poole แต่ก็ยังเป็นวิธีแก้ปัญหาอื่นขอบคุณต่อไป
50LV3R

-1 สำหรับเหตุผลที่ @AlexPoole ระบุไว้ หากคุณดำเนินการค้นหาอีกครั้งโดยไม่สร้างลำดับขึ้นใหม่คุณจะได้รับผลลัพธ์ที่แตกต่างกัน
miracle173

แบบสอบถามที่ใช้ลำดับไม่ส่งคืนชุดตัวเลขที่ต้องการ
miracle173

-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
ทำไมการคัดเลือกทั้งหมดระหว่างสตริงและตัวเลข ไม่แน่ใจทั้งหมดว่าสิ่งนี้จะเพิ่มคำตอบที่มีอยู่เพราะมันไม่ใช่สิ่งที่ OP ดูเหมือนจะมองหา
อเล็กซ์พูล

-1

เพิ่มขึ้นเพียงครั้งเดียวด้วยการเลือก rownum เลือก rownum + 100 จากคำสั่ง "table" 1;

ผลลัพธ์นั้นด้วย 101, 102 เป็นต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.