it-swarm.asia

تكوين عدد متزايد في استعلام Oracle sql

كيفية إنشاء عدد متزايد في استعلام Oracle sql دون إنشاء أي جدول؟ لقد حاولت استخدام عبارة "مع" ، لكنني فشلت في الحصول على النتيجة المتوقعة. أنا أستخدم 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
13
50LV3R

مشابه لإجابة كيري ، ولكن بدون with (والمستوحاة من SO 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;
14
Alex Poole

أعتقد أن هذا سيعمل (بناءً على هذه الصفحة ( 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 للحصول على نتائج مختلفة.

16
Kerri Shotts

يبدو أن OP كان يحاول حل المشكلة باستخدام استعلام فرعي تعاودي. لن يعمل هذا في 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;

الشيء الوحيد المفقود من استعلام OP هو (YEARS).

5
Leigh Riffel

لماذا لا تنشئ تسلسل فقط؟

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 

تحتاج فقط إلى جدول يحتوي على عدد كافٍ من الصفوف.

4
bernd_k