কীভাবে ওরাকল অর্ডার বা রউনুমকে সঠিকভাবে ব্যবহার করবেন?


126

আমাদের পণ্যটির সাথে সামঞ্জস্য রাখতে এসকিউএল সার্ভার থেকে স্টোরড পদ্ধতিগুলিকে ওরাকলে রূপান্তর করতে আমার বেশ কষ্ট হচ্ছে।

আমার কাছে এমন প্রশ্ন রয়েছে যা টাইমস্ট্যাম্পের ভিত্তিতে কিছু সারণীর সর্বাধিক সাম্প্রতিক রেকর্ডটি দেয়:

SQL সার্ভার:

SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC

=> এটি আমার সাম্প্রতিকতম রেকর্ডটি ফিরিয়ে দেবে

তবে ওরাকল:

SELECT *
FROM raceway_input_labo 
WHERE  rownum <= 1
ORDER BY t_stamp DESC

=> এটাই আমাকে পুরানো রেকর্ড ফিরিয়ে দেবে (সম্ভবত সূচকের উপর নির্ভর করে), ORDER BYবিবৃতি নির্বিশেষে !

আমি আমার প্রয়োজনীয়তাগুলির সাথে মেলে এইভাবে ওরাকল ক্যোয়ারিকে encapsulated করেছি:

SELECT * 
FROM 
    (SELECT *
     FROM raceway_input_labo 
     ORDER BY t_stamp DESC)
WHERE  rownum <= 1

এবং এটি কাজ করে। তবে এটি আমার কাছে ভয়াবহ হ্যাকের মতো মনে হচ্ছে, বিশেষত যদি এর সাথে জড়িত টেবিলগুলিতে আমার প্রচুর রেকর্ড থাকে।

এই অর্জন করার জন্য সবচেয়ে ভাল উপায় কি ?



4
আপনার শেষ প্রশ্নে আপনি যা করেছেন তা সঠিক। আপনি অর্ডার করা রেকর্ডের তালিকার প্রথম সারিটি নির্বাচন করুন। সহজভাবে জিজ্ঞাসা encapsulation।
আরাকনয়েড

1
এটি ম্যানুয়ালটিতে স্পষ্টভাবে নথিভুক্ত করা হয়েছে: ডকস.অরাকল.com
সিডি

5
@ a_horse_with_no_name আপনার অর্থ এই 404 ত্রুটিতে স্পষ্টভাবে নথিভুক্ত করা হয়েছে।
অ্যান্টনিব্রাইস

3
@ অ্যান্থনিব্রাইস: ধন্যবাদ ওরাকল তাদের সমস্ত ইউআরএল ম্যানুয়ালটিতে পরিবর্তন করেছে। আপ-টু-ডেট লিঙ্কটি হ'ল: docs.oracle.com/cd/E11882_01/server.112/e41084/…
a_horse_with_no_name

উত্তর:


120

whereবিবৃতি মৃত্যুদন্ড কার্যকর করা আগেorder by । সুতরাং, আপনার কাঙ্ক্ষিত ক্যোয়ারী বলছে " প্রথম সারিটি নিন এবং তারপরে এটি t_stamp ডেস্কের মাধ্যমে অর্ডার করুন "। এবং এটি আপনার ইচ্ছা কি নয়।

সাবাকারি পদ্ধতিটি ওরাকলে এটি করার জন্য সঠিক পদ্ধতি।

আপনি যদি এমন কোনও সংস্করণ চান যা উভয় সার্ভারে কাজ করে, আপনি ব্যবহার করতে পারেন:

select ril.*
from (select ril.*, row_number() over (order by t_stamp desc) as seqnum
      from raceway_input_labo ril
     ) ril
where seqnum = 1

বাইরেরটি *শেষ কলামে "1" এ ফিরে আসবে। এটি এড়াতে আপনার স্বতন্ত্রভাবে কলামগুলি তালিকাবদ্ধ করতে হবে।


40

ROW_NUMBER()পরিবর্তে ব্যবহার করুন। ROWNUMএটি একটি সিউডোকলমোন এবং ROW_NUMBER()এটি একটি ফাংশন। আপনি তাদের মধ্যে পার্থক্য সম্পর্কে পড়তে পারেন এবং নীচের প্রশ্নের আউটপুট মধ্যে পার্থক্য দেখতে পারেন:

SELECT * FROM (SELECT rownum, deptno, ename
           FROM scott.emp
        ORDER BY deptno
       )
 WHERE rownum <= 3
 /

ROWNUM    DEPTNO    ENAME
---------------------------
 7        10    CLARK
 14       10    MILLER
 9        10    KING


 SELECT * FROM 
 (
  SELECT deptno, ename
       , ROW_NUMBER() OVER (ORDER BY deptno) rno
  FROM scott.emp
 ORDER BY deptno
 )
WHERE rno <= 3
/

DEPTNO    ENAME    RNO
-------------------------
10    CLARK        1
10    MILLER       2
10    KING         3

3
ROWNUMROW_NUMBER()একে অপরের উপর একটি ব্যবহার করা উচিত কিনা তা এর চেয়ে দ্রুততর হতে পারে যা বিভিন্ন কারণের উপর নির্ভর করে।
ডেভিড ফ্যাবার

ডাউনটোটের জন্য ক্ষমা চেয়েছিলেন ভুল করে! দুর্ভাগ্যক্রমে আমি এখনই এটি ফিরিয়ে নিতে পারি না।
এথফাউড

0

এই ব্যবহারের ক্ষেত্রে আমি বিকল্প হিসাবে পরামর্শ দেব, সর্বশেষতম সারিটি পেতে ম্যাক্স (টি_স্ট্যাম্প) ব্যবহার করা ... উদাহরণস্বরূপ

select t.* from raceway_input_labo t
where t.t_stamp = (select max(t_stamp) from raceway_input_labo) 
limit 1

আমার কোডিং প্যাটার্ন পছন্দ (সম্ভবত) - নির্ভরযোগ্য, সাধারণত বাছাই করা তালিকা থেকে 1 ম সারিটি বেছে নেওয়ার চেষ্টা করার চেয়ে ভাল সম্পাদন করে - এছাড়াও অভিপ্রায়টি আরও স্পষ্টভাবে পাঠযোগ্য।
আশাকরি এটা সাহায্য করবে ...

SQLer


3
ওরাকলে কোনও সীমাবদ্ধ নেই। আপনি ভিক্ষা করছেন।
ফিলিপ্সি

0

উপরের মন্তব্যে এটির সাথে নকশাগুলির দু'দ্বীপযুক্ত ফাইলগুলি। সংক্ষিপ্ত বিবরণ, ওরাকল-এ, যখন আপনার কাছে একই কলামের নামযুক্ত বড় টেবিল এবং / অথবা সারণী থাকে তখন আপনাকে ফলাফলগুলি ম্যানুয়ালি সীমাবদ্ধ করতে হবে (এবং আপনি এগুলি সমস্ত স্পষ্টভাবে টাইপ করে সমস্ত নামকরণ করতে চান না)। সহজ সমাধান হ'ল আপনার ব্রেকপয়েন্টটি বের করা এবং এটি আপনার ক্যোয়ারিতে সীমাবদ্ধ করা। অথবা আপনি যদি বিরোধী কলামের নাম সীমাবদ্ধ না হন তবে আপনি অভ্যন্তরীণ কোয়েরিতেও এটি করতে পারেন। যেমন

WHERE m_api_log.created_date BETWEEN TO_DATE('10/23/2015 05:00', 'MM/DD/YYYY HH24:MI') 
                                 AND TO_DATE('10/30/2015 23:59', 'MM/DD/YYYY HH24:MI')  

ফলাফলগুলি যথেষ্ট পরিমাণে কাটাবে। তারপরে আপনি সারি সীমাবদ্ধ করার জন্য বাইরের ক্যোয়ারী অর্ডার করতে বা এমনকি করতে পারেন।

এছাড়াও, আমি মনে করি সারি সীমাবদ্ধ করার জন্য টোডের একটি বৈশিষ্ট্য রয়েছে; তবে, এটি নিশ্চিত নয় যে ওরাকলটিতে প্রকৃত ক্যোয়ারির মধ্যে সীমাবদ্ধ রয়েছে। নিশ্চিত না.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.