ওরাকল এসকিএল থেকে মাত্র 1 টি সারি কীভাবে নির্বাচন করবেন?


110

আমি টেবিল থেকে কেবল 1 সারি নির্বাচন করতে ওরাকল সিনট্যাক্স ব্যবহার করতে চাই DUAL। উদাহরণস্বরূপ, আমি এই কোয়েরিটি সম্পাদন করতে চাই:

SELECT user 
  FROM DUAL

... এবং এটি 40 টি রেকর্ডের মতো থাকতে পারে। তবে আমার কেবল একটি রেকর্ড দরকার। ... এবং, আমি এটি কোনও WHEREধারা ছাড়াই এটি করতে চাই ।

আমার টেবিলের নাম ক্ষেত্রের এমন কিছু দরকার যেমন:

SELECT FirstRow(user) 
  FROM DUAL

1
ওরাকল এর কোন সংস্করণ? ROWNUM বা ROW_NUMBER (9i +) ব্যবহারের অর্থ হ'ল যেখানে একটি ক্লজ দরকার
ওএমজি পনিস

1
আপনি একটি টেবিল নামকরণ করেছেন dual?
ypercubeᵀᴹ

1
@ypercube dualহল ওরাকলে সিস্টেম টেবিল

4
@ বেন, আপনার আসলে বলা একটি টেবিল তৈরি করা উচিত নয় DUAL। এটি কিছুটা #define TRUE 0সি এর মতো - অবশ্যই, এটি আপনার পক্ষে কাজ করতে পারে তবে ভবিষ্যতের বিকাশকারীরা আপনাকে ঘৃণা করবে।
জেফ্রি কেম্প

3
আপনি কি আসলে দৌড়ানোর চেষ্টা করেছেন select user from dual? যদি তা না হয় তবে দয়া করে চেষ্টা করে দেখুন এবং কী পান তা দেখুন। একটি স্ট্যান্ডার্ড ওরাকল সিস্টেমে আপনি যে ব্যবহারকারীর সাহায্যে কমান্ডটি কার্যকর করছেন তা ফিরে পাবেন।
শ্যানন সিভেরেন্স

উত্তর:


169

আপনি ROWNUM ব্যবহার করেন।

অর্থাত।

SELECT user FROM Dual WHERE ROWNUM = 1

http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm


@ টাইপকিউব যতদূর আমি বলতে পারি, এটি করে। (কমপক্ষে এটি আমার oracle10g ইনস্টল করার জন্য কাজ করে))

@ বিদারেস: এটি কার্যকর হবে, হ্যাঁ। তবে আপনার উত্তরটি নয় order by
ypercubeᵀᴹ

1
হ্যাঁ. ROWNUM একটি বিশেষ কলাম যা ফলাফলগুলি গণনা করে ফলাফল সেটটিতে যুক্ত হয়। আপনি এটি একাধিক নির্বাচন করতেও ব্যবহার করতে পারেন, উদাহরণস্বরূপ, আপনি যদি সর্বাধিক বেতনভোগী 10 জন কর্মী খুঁজে পেতে চান তবে আপনি বলতে পারেন "স্যালারি ডিজাইনের মাধ্যমে কর্মচারী থেকে <= 10 অর্ডার নির্বাচন করুন"
মাইন্ড ভাইরাস

10
@ এমকেডি: না, এর ORDER BYপরে প্রয়োগ করা হয় WHERE
ypercubeᵀᴹ

15
আপনার প্রয়োজন হবে:SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
ypercubeᵀᴹ

49

আমি একটি মন্তব্যে এই "সমাধান" লুকানো পেয়েছি। যেহেতু আমি এটি কিছুক্ষণ সন্ধান করছিলাম, তাই আমি এটিকে কিছুটা হাইলাইট করতে চাই (এখনও মন্তব্য করতে বা এই জাতীয় জিনিসগুলি করতে পারে না ...), তাই এটিই আমি ব্যবহার করেছি:

SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1

এটি টেবিলে সর্বাধিক নতুন এন্ট্রি থেকে আমার পছন্দসই [কলাম] প্রিন্ট করবে, ধরে নিবেন যে [তারিখ] সর্বদা SYSDATE এর মাধ্যমে sertedোকানো হয়।


আমি দেখেছি এটি অর্ডার করলেও এটি কাজ করবে ROWID, যতক্ষণ না আপনি কখনই কোনও রেকর্ড মুছবেন না এবং সর্বদা সর্বদা সন্নিবেশিত / সংশোধিত প্রতি যত্নশীল হন।
vapcguy

@ ভ্যাপকুই: আপনি কখনই টেবিল থেকে কোনও সারি মুছবেন না তা সত্ত্বেও রাউইড অর্ডার হওয়ার আশা করবেন না! এমনকি যদি এটি এখন আপনার জন্য কাজ করে তবে ভবিষ্যতের সংস্করণগুলিতে এটি কখনও কাজ করার গ্যারান্টিযুক্ত নয়।
ডি মিকা

@ ডি.মিকা আসলে এখন যদি এটি কাজ করে এবং আপনি কখনই রেকর্ড যুক্ত / অপসারণ / আপডেট / মুছবেন না, কোনও সমস্যা হওয়ার দরকার নেই। রেকর্ডগুলি কেবলমাত্র যদি আপনি সেগুলি পরিবর্তন করেন তবে তা পরিবর্তন করা যাবে। এই ভ্রান্ত ধারণাটি রয়েছে যে কোনওভাবে ROWIDওরাকল দ্বারা এলোমেলোভাবে সংশোধন করা হয়েছে। এটা না। এটি আসলে সারিগুলিকে সংশোধন করার উপর ভিত্তি করে, অর্থাৎ আপনি একটি মুছুন, তারপরে একটি .োকান। .োকানোটি পুরানোটি পাবে ROWID। স্ট্যাটিক টেবিলের মতো জিনিস রয়েছে যা মার্কিন যুক্তরাষ্ট্রে আপডেটের মতো রাজ্যগুলি কখনই পাওয়া যায় না এটি একটি উত্তম উদাহরণ where যেখানে যদি এটি পরিবর্তিত হয় তবে সম্ভবত এটির অন্যান্য প্রতিক্রিয়াও থাকতে পারে, যখন এটি ঠিক আছে।
vapcguy

@ বাপকুই: ঠিক আছে, প্রায় ঠিক আছে। তবে এমন অন্যান্য অপারেশন রয়েছে যা রাউইউআইডি পরিবর্তন করবে। আপনি যদি কোনও কারণে টেবিলটি রফতানি / আমদানি করেন তবে? অন্যদের অপারেশন রয়েছে, তবে তাদের মধ্যে কিছুর জন্য সক্রিয় সারি মুভমেন্ট প্রয়োজন। আমি কেবল এটিই বলতে চাই ভবিষ্যতে পরিবর্তিত হতে পারে এমন একটি বাস্তবায়নের বিশদটির উপর নির্ভর করা ভাল ধারণা নয়।
ডি মিকা

@ ডি.মিকা আমি নিশ্চিত যে যদি এমন কোনও অপারেশন হয় যেখানে এটি ROWIDপরিবর্তন করা যেতে পারে, একটি ভাল ডিবিএ তাদের তদারকি করবে এবং তাদের এড়াতে তারা যা করতে পারত তা করার চেষ্টা করত যদি তারা যেমন স্থির টেবিলকে প্রভাবিত করার সম্ভাবনা থাকে তবে আমি বর্ণনা করেছি যে শুধুমাত্র অ্যাপ্লিকেশনটি চালিত হওয়া উচিত। SELECTপরিবর্তে একটি বিবৃতি দিয়ে একটি টেবিল রফতানি করা যেতে পারে । আমদানি একবার হবে এবং তারপর আর কখনও হবে। আমি আপনার বক্তব্যটি পেয়েছি, অবশ্যই যত্নের প্রয়োজন, তবে সমস্যাগুলি অনিবার্য থেকে অনেক দূরে।
vapcguy

35

এই সিনট্যাক্সটি ওরাকল 12 সি তে উপলব্ধ:

select * from some_table fetch first 1 row only;
select * from some_table fetch first 1 rows only;
select * from some_table fetch first 10 row only;
select * from some_table fetch first 10 rows only;

^^ আমি কেবল প্রদর্শন করতে চেয়েছিলাম যে সারি বা সারি (বহুবচন) কাঙ্ক্ষিত সংখ্যার সারিগুলির বহুবচন নির্বিশেষে ব্যবহার করা যেতে পারে))


1
কেবলমাত্র 1 টি সারিতে প্রথম_ সারণী থেকে * নির্বাচন করুন; এটি আমার swl ডিভলপারে কাজ করছে না এবং স্কুয়েল প্লাসে কাজ করছে না তাই আনার সময় ত্রুটি।
নিখিল সুগন্ধ আজ

আপনি কি ওরাকল 12 সি ব্যবহার করছেন?
mancini0

আমি সত্যিই জানি না তবে যখন আমি এটি খুলি তখন এটি এটির মতো দেখায়: এসকিউএল * প্লাস রিলিজ 10.1.0.4.2 এটি কি 12 সি নয়
নিখিল সুগন্ধ

সঠিক - আপনি সম্ভবত সংস্করণ 10.1.xxx ব্যবহার করছেন, আপনি * ভি $ সংস্করণ থেকে বেছে নিতে পারেন
mancini0

10

ওরাকল ডিবি টেবিলে প্রথম সারিটি পেতে আমাদের কাছে 3 টি পছন্দ রয়েছে।

1) select * from table_name where rownum= 1সেরা উপায়

2) select * from table_name where id = ( select min(id) from table_name)

3)

select * from 
    (select * from table_name order by id)
where rownum = 1

উত্তরের জন্য ধন্যবাদ: পয়েন্ট 3 এর অধীনে) "নওরাম = 1" সম্ভবত "রোউনাম = 1" এ পরিবর্তন করা উচিত।
আন্দ্রে নেল

7

যতদূর আমি জানি, dualওরাকলে টেবিলটি একটি বিশেষ টেবিল যা কেবল একটি সারি। সুতরাং, এটি যথেষ্ট হবে:

SELECT user
FROM dual

দ্বৈত থেকে সঠিক নির্বাচিত ব্যবহারকারী আপনার সমস্ত ব্যবহারকারীদের দেওয়া উচিত নয়
বেন


1
.. এবং স্রেফ আমার সিস্টেমে চেষ্টা করে দেখেছি, ইপারকিউব হিসাবে কাজ করে এবং সম্পর্কিত সম্পর্কিত সমস্ত ডকুমেন্টেশন উল্লেখ করে। @
বেন

1
@ বেন দ্বৈত একটি ক্যাটালগ ভিউ নয়, এটি "সমস্ত ব্যবহারকারী" দেখায় না। আপনি এই উদ্দেশ্যে ALL_USERS এর মত একটি ভিউ ব্যবহার করবেন।
মাক্রাম

7

Answer উত্তরটি হ'ল:

আপনার নেস্টেড ক্যোয়ারী এটি হিসাবে ব্যবহার করা উচিত:

SELECT *
FROM ANY_TABLE_X 
WHERE ANY_COLUMN_X = (SELECT MAX(ANY_COLUMN_X) FROM ANY_TABLE_X) 

=> পিএল / এসকিউএল তে "ROWNUM = 1" টিএসকিউএল এর "শীর্ষ 1" এর সমান নয়।

সুতরাং আপনি এই জাতীয় কোনও কোয়েরি ব্যবহার করতে পারবেন না: "যে কোনও_সামগ্রী_এক্সে rownum = 1 ক্রম যেখানে কোনও_ টেবিল_এক্স থেকে * নির্বাচন করুন;" কারণ ওরাকল প্রথম সারিতে আসে তারপরে ধারা দ্বারা আদেশ প্রয়োগ করে।


1
দয়া করে আপনার উত্তরে কিছু স্পষ্টতা যুক্ত করুন
hgWittle

কোনও ভাল কারণ ছাড়াই অস্বাভাবিক সিনট্যাক্স এড়ানো উচিত। এই ক্ষেত্রে, এটি কোনও পরীক্ষার কেস বা একটি বাগ নম্বর সরবরাহ করা সহায়ক। আমি অস্পষ্টভাবে কিছু অদ্ভুত সমস্যাগুলি স্মরণ করি rownum = 1, তবে আমাদের পুরানো বাগগুলি আর আমাদের কোডকে প্রভাবিত করা উচিত নয়।
জন হেলার

7
@ এইচ জি হোইটল, ফুয়াত সঠিক হওয়ার কারণটি হ'ল রাউনুম 'অর্ডার বাই' সম্পর্কে চিন্তা করে না, এটি এটি প্রথম রেকর্ডটি খুঁজে পায় যা এটি খুঁজে পেতে পারে এবং তত্ক্ষণাত তা ফিরিয়ে দেয়। সুতরাং অন্য কথায়, ROWNUM বাছাইপথের "অর্ডার বাই" কমান্ডের কোনও সম্মান নেই। আমি চাই যে নেস্টেড কোয়েরিটি ব্যবহার করার জন্য ঘটনাটি না হলেও ফুয়াত সঠিক ছিল।
এরিক মিলিয়ট-মার্টিনেজ

5

limit 1ওরাকলে কোনও শর্ত নেই (মাইএসকিউএল / পোস্টগ্রিসএসকিউএল), আপনাকে উল্লেখ করতে হবে where rownum = 1


5

"ফার্স্টরো" হ'ল একটি বিধিনিষেধ এবং এটির জন্য এটি ধারাটিতে whereনয় select। এবং এটি rownum বলা হয়

select * from dual where rownum = 1;

1
নোট করুন যে এটি মিলিত হিসাবে প্রত্যাশিত হিসাবে কাজ করবে না ORDER BY, যেহেতু অর্ডিং কেবল যেখানে ক্লজ এর পরে ঘটে । অন্য কথায়, একটি নির্দিষ্ট সাজানো ক্যোয়ারির শীর্ষস্থান পেতে, রোউনাম সম্পূর্ণরূপে অকেজো।
নায়ারগডস

@ নাইয়ারগুডস, এটি কেবলমাত্র অর্ধেক সত্য। Whereএকটি ভিউ ক্যোয়ারী সহ আপনি আগে অর্ডারটি ব্যবহার করতে পারেন ।
gdoron মনিকা

4
কি, তাই SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1? ঠিক আছে, এটি কার্যকর হতে পারে তবে এটি বেশ বোবা দেখাচ্ছে, টিবিএইচ।
নাইয়ারগডস

2

যদি কোনও সারি করে, চেষ্টা করুন:

select max(user)  
from table;

না যেখানে ধারা।


9
অবশ্যই আপনার নিজের জন্য এটি চেষ্টা করতে কয়েক সেকেন্ড সময় লাগবে
ম্যাট ডোনান


1

select a.user from (select user from users order by user) a where rownum = 1

সেরা সঞ্চালন করবে, অন্য বিকল্পটি হ'ল:

select a.user 
from ( 
select user, 
row_number() over (order by user) user_rank, 
row_number() over (partition by dept order by user) user_dept_rank 
from users 
) a 
where a.user_rank = 1 or user_dept_rank = 2

এমন পরিস্থিতিতে যেখানে আপনি বিভিন্ন সাবসেট চান তবে আমার ধারণা আপনিও ব্যবহার করতে পারেন RANK()তবে, আমিও পছন্দ করি row_number() over(...)যেহেতু কোনও গ্রুপিংয়ের প্রয়োজন নেই required


0

আপনি যদি সর্বনিম্ন সাবকিউরিয়াস সহ কেবল বাছাই করা ফলাফলের প্রথম সারিতে ফিরে আসতে চান তবে এটি ব্যবহার করে দেখুন:

select *
  from ( select a.*
              , row_number() over ( order by sysdate_col desc ) as row_num
           from table_name a )
  where row_num = 1;

Sysdate_col হ'ল যে কোনও কলামের নাম এবং অবশ্যই আপনি বাছাই করতে চান সেখানে টেবিলের নামটি সেই সারণীর নাম হবে যা আপনি সাজানো ডেটা আসতে চান।
জোডি ফেডোর

-1

তুলনায় আরও নমনীয় select max():

select distinct first_row(column_x) over (order by column_y,column_z,...) from Table_A
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.