2009-11-09 14 views
7

से नीचे सभी अन्य मैं एक प्रश्न एक साथ रखने की कोशिश कर रहा हूं जो शीर्ष पर एक विशिष्ट रिकॉर्ड (रिकॉर्ड की प्राथमिक आईडी द्वारा पाया गया) प्रदर्शित करेगा, और इसके नीचे अन्य सभी रिकॉर्ड प्रदर्शित करेगा, तिथि से क्रमबद्ध (प्राथमिक आईडी के अलावा, तालिका में फ़ील्ड में से एक के रूप में "date_added" है)।एसक्यूएल शीर्ष पर एक विशिष्ट रिकॉर्ड है,

मैं इसे यूनियन के साथ कर सकता हूं (पहला चयन उस रिकॉर्ड का पता लगाएगा जो मैं चाहता हूं, और दूसरा चयन अन्य सभी रिकॉर्ड प्रदर्शित करेगा), लेकिन मुझे आश्चर्य है कि शायद कोई बेहतर तरीका है या नहीं?

मैं ओरेकल का उपयोग कर रहा हूं।

उत्तर

17

आप दो क्षेत्रों

आधार पर क्रमित करके ऐसा कर सकते हैं

पहले एक अभिव्यक्ति है कि 0 लौटाता है हो सकता है अगर पंक्ति आप जो चाहते है या 1 यदि यह नहीं है 'टी। सॉर्ट आरोही हो जाएगा ताकि आपको पहले अपना पसंदीदा रिकॉर्ड मिल सके।

दूसरा सॉर्ट फ़ील्ड date_added होगा ताकि शेष रिकॉर्ड इस क्रम में क्रमबद्ध किए जा सकें।

डर मैं की तरह

select * 
from the_table 
order by (case id when 999 then 0 else 1 end), date_added desc 
+0

उत्तर के लिए धन्यवाद। "0 से ऑर्डर" का मतलब क्या है? मैंने देखा है कि मैं इसका इस्तेमाल स्वयं नहीं कर सकता, उदा। केवल "ऑर्डर द्वारा 0"। (मुझे त्रुटि मिलती है: "आइटम द्वारा आदेश एक चयन-सूची अभिव्यक्ति की संख्या होना चाहिए") – Dario

+1

' द्वारा आदेश 'ओरेकल में एक विशेष अर्थ है, यह एनएच कॉलम पर सॉर्ट करेगा। बेशक कोई 0 वां स्तंभ नहीं है। केस के साथ, यह प्रत्येक पंक्ति में एक नया कॉलम जोड़ देगा और उस पर सॉर्ट करेगा। मिलान करने वाली प्राथमिक कुंजी के लिए नया कॉलम 1 और 0 और हर जगह होगा। – Andomar

1

मैं Oracle वास्तव में पता नहीं है, लेकिन आप शायद कुछ की तरह कर सकता है ..

ORDER BY IF(id == THE_ID, 0, 1), date_added 
+0

+1 सुनिश्चित नहीं है कि ओरेकल हालांकि इस तरह का समर्थन करता है! – Andomar

+0

ओरेकल आईआईएफ का समर्थन नहीं करता है, लेकिन आप 'DECODE (आईडी, THE_ID, 0,1)' – Andomar

7

एक आसान तरीका निर्माण के द्वारा एक फैंसी आदेश होगा। यहाँ पी के लिए एक उदाहरण है = 123:

select * 
from YourTable 
order by case when yourpk = 123 then 1 else 2 end, date_added 
+0

कर सकते हैं, यह अंत में विशिष्ट रिकॉर्ड रखेगा, "... फिर 1 और 2 अंत ..." होना चाहिए –

+0

@ammoQ: धन्यवाद, उत्तर संपादित किया गया (reko_t पहले जैसा ही विचार पोस्ट किया गया था) – Andomar

-1

कुछ एसक्यूएल सर्वर में यह होगा द्वारा ओरेकल पता नहीं है आसान तरीका पहचान करने के लिए है कि आप दो अलग-अलग बातें प्रदर्शित करने के लिए और इसलिए सीधा प्रश्नों को अलग करने के बारे में चाहते हो जाएगा। पहला रिकॉर्ड पुनर्प्राप्त करने के लिए एक प्रश्न, और दूसरा क्रमबद्ध सूची पुनर्प्राप्त करने के लिए। एक अद्वितीय रिकॉर्ड के कारण इससे कुछ भी करने के लिए कोई वास्तविक प्रदर्शन लाभ नहीं है।

+0

हां, लेकिन एक SQL कथन के रूप में इसे करने के फायदे हैं। कुछ वातावरण (उदा। रिपोर्टिंग सूट) एसक्यूएल संरचनाओं के आसान पुन: उपयोग की अनुमति नहीं देते हैं, इसलिए उन्हें दो बार SQL को दोहराना पड़ सकता है, जो रखरखाव के लिए समस्याग्रस्त है। इसके अलावा, एसक्यूएल में इसे करना अधिक consise है :-)। – sleske

0
SELECT * 
FROM `Table` 
ORDER BY (`id` = THE_ID) DESC, `date_added` DESC 
0

आप उसी तकनीक का

999 पहले 998 दूसरा सब कुछ किसी और तारीख

चयन * के अनुसार क्रमबद्ध के बाद का उपयोग कर शीर्ष करने के लिए एक से अधिक रिकॉर्ड सॉर्ट कर सकते हैं

from the_table 
order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc 
संबंधित मुद्दे