استعلام SQL مع Row_Number من حيث شرط
-
08-07-2019 - |
سؤال
لدي استعلام SQL التالي:
select
ID, COLUMN1, COLUMN2
from
(select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
NO between 0 and 100
ما أحاول القيام به هو اختيار أول 100 سجلات الاستعلام
select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC
و ها هي المشاكل:
على ما يبدو ،
order by
شرط لا يعمل.لقد لاحظت أن لدي إضافة آخرorder by 2 DESC
شرط بعد(...) from ATABLE
, و الاستعلام إلى العمل.هل هناك شيء أفعله خطأ ؟ أو المتوقع السلوك ؟كيف يمكنني إضافة
where
الحدوث ؟ دعونا نقول كنت تحتاج إلى اختيار فقط أول 100 السجلات من الجدولwhere COLUMN1 like '%value%'
.لقد حاولت إضافة جملة where بعد(...) from ATABLE
ولكنها أنتجت خطأ...
مساعدة ؟ شكرا
PS:أنا باستخدام Oracle 10g R2.
المحلول
rownum هو زائف عمود التهم الصفوف في مجموعة النتائج بعد شرط حيث تم تطبيقها.
هل هذا ما تحاول الحصول عليه ؟
SELECT *
FROM (
SELECT id, column1, column2
FROM atable ORDER BY 2 DESC
)
WHERE ROWNUM < 100;
لأنه الزائفة عمود بدقة عداد من الصفوف الناتجة من حيث شرط انها لن تسمح لك أن تفعل ترقيم الصفحات (أيبين 200 و 300).
وربما هذا هو ما تبحث عنه:
SELECT *
FROM
(SELECT a.*, rownum rnum FROM
(SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
WHERE rnum >= 200;
نصائح أخرى
تحقق من هذه التعليمات أوراكل.وخاصة هذا الجزء:
SELECT *
FROM (SELECT a.*, rownum RN
FROM (SELECT *
FROM t1 ORDER BY key_column) a
WHERE rownum <=7)
WHERE rn >=5
للإجابة على السؤال الأول:لا تستخدم رقم العمود في النظام الخاص بك عن طريق الشرط ، ولكن استخدام اسم العمود.أنا لا أفهم سؤالك الثاني, لأن إضافة حيث في معظم الداخلي حدد ينبغي أن تفعل خدعة:
select ID
, COLUMN1
, COLUMN2
from (select ID
, COLUMN1
, COLUMN2
, row_number() over (order by COLUMN1 DESC) NO
from A_TABLE
where COLUMNX LIKE '%SOME VALUE%'
)
where NO between 0 and 100
P. S.(إلى willcodejavaforfood) أعتقد أن استخدام row_number() هو الأفضل عندما تريد الصفوف إلى أن يؤمر.فإنه يحفظ الداخلية عرض (الفوز الكبير على القراءة).
لماذا لا تستخدم
Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc
هنا سوف تحصل على محدودية سجل من قاعدة بيانات oracle دون استخدام rownum
select * from
( select ,column1,column2,row_number() over (order by columnName) as rnum
from table_name)
where rnum between 5 and 10;