ऑरेकल एसक्यूएल से केवल 1 पंक्ति का चयन कैसे करें?


110

मैं तालिका से केवल 1 पंक्ति का चयन करने के लिए oracle सिंटैक्स का उपयोग करना चाहता हूं DUAL। उदाहरण के लिए, मैं इस क्वेरी को निष्पादित करना चाहता हूं:

SELECT user 
  FROM DUAL

... और यह 40 रिकॉर्ड की तरह होगा। लेकिन मुझे केवल एक रिकॉर्ड चाहिए। ... और, मैं इसे बिना किसी WHEREखंड के बनाना चाहता हूं ।

मुझे table_name फ़ील्ड में कुछ चाहिए जैसे:

SELECT FirstRow(user) 
  FROM DUAL

1
Oracle का क्या संस्करण? ROWNUM या ROW_NUMBER (9i +) का उपयोग करने का अर्थ होगा कि WHERE क्लॉज़ की आवश्यकता होगी
OMG Ponies

1
क्या आपने एक टेबल का नाम बताया है dual?
ypercube y

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


@ypercube जहाँ तक मैं बता सकता हूँ, यह करता है। (कम से कम यह oracle10g की मेरी स्थापना के लिए काम करता है।)

@bdares: यह काम करेगा, हाँ। लेकिन आपका जवाब नहीं, के साथ order by
ypercube y

1
हाँ। ROWNUM एक विशेष कॉलम है, जो परिणामों को शामिल करते हुए परिणाम सेट में जुड़ जाता है। उदाहरण के लिए, आप कई का चयन करने के लिए इसका उपयोग कर सकते हैं, उदाहरण के लिए, यदि आप 10 उच्चतम वेतन वाले कर्मचारियों को ढूंढना चाहते थे, तो आप कह सकते हैं कि "कर्मचारी से चयन करें उपयोगकर्ता जहां डाउनलोड किया गया है <= 10 आदेश द्वारा
दैनिक

10
@mkdess: नहीं, के ORDER BYबाद लागू किया जाता है WHERE
ypercube y

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 के माध्यम से डाला जाता है।


मैंने पाया कि यह तब भी काम करेगा जब तक आप आदेश देते हैं ROWID, जब तक आप कभी भी कोई रिकॉर्ड नहीं हटाते हैं और हमेशा अंतिम सम्मिलित / संशोधित के बारे में परवाह करते हैं।
21

@vapcguy: यदि आप कभी भी तालिका से एक पंक्ति नहीं हटाते हैं, तो ROWID का आदेश देने की अपेक्षा न करें! यहां तक ​​कि अगर यह अब आपके लिए काम करता है, तो यह भविष्य के संस्करणों में काम करने की गारंटी नहीं है।
डी। मिका

@ डी.मिका वास्तव में अगर यह अब काम करता है, और आप कभी भी रिकॉर्ड जोड़ / हटा / अपडेट नहीं करते हैं, तो कभी भी कोई समस्या नहीं होनी चाहिए। रिकॉर्ड केवल तभी बदले जा सकते हैं यदि आप वास्तव में उन्हें बदलते हैं। यह गलत धारणा है कि किसी तरह ROWIDओरेकल द्वारा यादृच्छिक रूप से संशोधित किया गया है। यह नहीं है। यह वास्तव में पंक्तियों को संशोधित करने पर आधारित है, यानी आप एक को हटाते हैं, फिर एक को सम्मिलित करते हैं। डालने वाले को पुराना मिलेगा ROWID। स्थैतिक तालिकाओं के रूप में ऐसी चीजें हैं जो अमेरिका में कभी भी अपडेट-किए गए राज्यों की तरह नहीं मिलती हैं, यह एक अच्छा उदाहरण है-जहां अगर इसे बदल दिया जाता है, तो संभवत: यह अन्य नतीजे होंगे, वैसे भी, जब यह ठीक है।
vapcguy

@vapcguy: ठीक है, लगभग सही है। लेकिन ऐसे अन्य ऑपरेशन हैं जो ROWID को बदल देंगे। यदि आप किसी कारण से तालिका का निर्यात / आयात करते हैं तो क्या होगा? अन्य ऑपरेशन भी हैं, लेकिन उनमें से कुछ को ENOW ROW MOVEMENT की आवश्यकता है। मैं सिर्फ इतना कहना चाहता हूं कि कार्यान्वयन विस्तार पर भरोसा करना अच्छा नहीं है जो भविष्य में बदल सकता है।
डी। मिका

@ D.Mika मुझे यकीन है कि अगर कोई ऑपरेशन होता है, जहां ROWIDबदला जा सकता है, तो एक अच्छा डीबीए उन्हें देख लेगा और वह कर सकता है जो उन्हें बचने के लिए हो सकता है अगर संभावना थी कि वे इस तरह के एक स्थिर तालिका को प्रभावित कर रहे थे जैसा कि मैंने वर्णन किया है कि केवल आवेदन ही चालू होना चाहिए। SELECTइसके बजाय एक टेबल एक्सपोर्ट एक स्टेटमेंट के साथ किया जा सकता है । आयात एक बार होगा और फिर कभी नहीं होगा। मुझे आपकी बात मिल गई, देखभाल की ज़रूर ज़रूरत है, लेकिन मुद्दे अपरिहार्य हैं।
vapcguy

35

यह सिंटैक्स Oracle 12c में उपलब्ध है:

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 devloper में काम नहीं कर रहा है और न ही sql प्लस में इतना गड़बड़ है।
निखिल सुगंध

क्या आप orc 12c का उपयोग कर रहे हैं?
mancini0

मैं वास्तव में नहीं जानता, लेकिन जब मैं इसे खोलता हूं तो यह इस तरह दिखाता है: SQL * PLus रिलीज़ 10.1.0.4.2 क्या यह 12 सी नहीं है
nikhil sugandh

सही - आप 10.1.xxx संस्करण का उपयोग करने की संभावना का उपयोग कर रहे हैं, आप V $ VERSION से * का चयन कर सकते हैं
mancini0

10

Oracle DB तालिका में पहली पंक्ति प्राप्त करने के लिए हमारे पास 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
.. और बस मेरे सिस्टम पर कोशिश की, ypercube और सभी संबंधित प्रलेखन उल्लेख के रूप में काम करता है। @ बनिए
सत्यजित भट्ट

1
@ कोई दोहरे सूची दृश्य नहीं है, यह "सभी उपयोगकर्ताओं" को नहीं दिखाएगा। आप उस उद्देश्य के लिए ALL_USERS जैसे दृश्य का उपयोग करेंगे।
makrom

7

Is जवाब है:

आपको नेस्टेड क्वेरी का उपयोग इस प्रकार करना चाहिए:

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

=> PL / SQL में "ROWNUM = 1" TSQL के "टॉप 1" के बराबर नहीं है।

तो आप इस तरह से एक क्वेरी का उपयोग नहीं कर सकते हैं: "any_table_x से पंक्ति का चयन करें जहाँ किसी भी पंक्ति_ पंक्ति से = 1 आदेश any_column/x;" चूँकि oracle को पहली पंक्ति मिलती है, फिर वह खंड द्वारा आदेश लागू करता है।


1
कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें
hgwhittle

बिना किसी अच्छे कारण के असामान्य वाक्य रचना से बचना चाहिए। इस मामले में, टेस्ट केस या बग नंबर प्रदान करना सहायक होगा। मैं अस्पष्ट रूप से कुछ अजीब मुद्दों को याद करता हूं rownum = 1, लेकिन हमें पुराने कीड़े को हमारे कोड को प्रभावित नहीं करने देना चाहिए।
जॉन हेलर

7
@hwhwhittle, फयुट के सही होने का कारण यह है कि ROWNUM को 'ऑर्डर द्वारा' की परवाह नहीं है, यह सिर्फ पहले रिकॉर्ड को पकड़ लेता है जो इसे खोज सकता है और तुरंत इसे वापस कर सकता है। तो दूसरे शब्दों में, ROWNUM क्वालिफायर के पास "ऑर्डर बाय" कमांड के लिए कोई सम्मान नहीं है। मेरी इच्छा है कि ऐसा न हो, लेकिन फिएट सही है, नेस्टेड क्वेरी का उपयोग करने के लिए।
एरिक मिलियट-मार्टिनेज

5

limit 1ओरेकल में कोई शर्त (MySQL / PostgresSQL) नहीं है, आपको निर्दिष्ट करने की आवश्यकता है where rownum = 1


5

"FirstRow" एक प्रतिबंध है और इसके लिए यह whereखंड में नहीं बल्कि खंड में जगह है select। और इसे पंक्तिबद्ध कहा जाता है

select * from dual where rownum = 1;

1
ध्यान दें कि यह संयोजन के साथ अपेक्षित रूप से काम नहीं करेगा ORDER BY, क्योंकि ऑर्डर केवल क्लॉज के बाद होता है । दूसरे शब्दों में, एक निश्चित क्रमबद्ध क्वेरी के शीर्ष को प्राप्त करने के लिए, पंक्तिबद्ध करना पूरी तरह से बेकार है।
Nyerguds

@ नायरगुड्स, यह केवल आधा सच है। आप Whereदृश्य क्वेरी के साथ पहले ऑर्डर का उपयोग कर सकते हैं ।
gdoron

4
क्या है, तो SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1? ठीक है, यह काम कर सकता है, लेकिन यह बहुत गूंगा, tbh दिखता है।
Nyerguds

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(...)क्योंकि किसी समूह की आवश्यकता नहीं है।


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 आपके द्वारा छांटे जाने वाले किसी भी कॉलम का नाम होगा और निश्चित रूप से, table_name उस तालिका का नाम होगा जिसे आप सॉर्ट किए गए डेटा से आना चाहते हैं।
जोडी फेडर

-1

से अधिक लचीला select max()है:

select distinct first_row(column_x) over (order by column_y,column_z,...) from Table_A
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.