SQL में यूनियन के साथ ऑर्डर कैसे करें?


201

क्या यह आदेश देना संभव है जब डेटा कई चुनिंदा से आता है और एक साथ मिल जाता है? जैसे कि

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"

मैं इस क्वेरी को नाम से कैसे आदेश दे सकता हूं।

कुछ ने कहा कि आप इस तरह देख सकते हैं।

Select id,name,age
From Student
Where age < 15 or name like "%a%"
Order by name

लेकिन इस मामले में मैं सिर्फ उस समाधान को नजरअंदाज करता हूं।


1
यदि आपके पास यूनियन क्वेरी में समान कॉलम है, तो अंत में अपने कॉलम नाम से ऑर्डर करें।
अनिर्बान करक

जवाबों:


266

बस लिखें

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"
Order by name

द्वारा आदेश को पूरे परिणाम पर लागू किया जाता है


45
क्या होगा यदि मैं चाहता हूं कि इस प्रकार केवल एक ही शीर्ष पर लागू किया जाए?
मेरीफ्रेमन

7
@marifrahman मेरा उत्तर देखें stackoverflow.com/a/43855496/2340825
BA TabNabber

2
@marifrahman को एक पुराना विषय खोदने के लिए खेद है, लेकिन यह दूसरों की मदद कर सकता है। यदि आप चाहते हैं कि ORDER BY को UNION के पहले भाग में लागू किया जाए, तो कोष्ठक के साथ इस SELECT को सुरक्षित रखें।
लीडेन क्योकू

82
Select id,name,age
from
(
   Select id,name,age
   From Student
   Where age < 15
  Union
   Select id,name,age
   From Student
   Where Name like "%a%"
) results
order by name

46
जैसा कि bernd_k ने बताया है, परिभाषा के अनुसार, यूनिअन बनाने वाले व्यक्तिगत चयनों को किसी भी आदेश के अनुसार आदेश देने की अनुमति नहीं है। एकमात्र आदेश द्वारा खंड की अनुमति यूनिअन के अंत में है और यह पूरे xxx UNION yyy ORDER BY zzzयूएनओएन पर लागू होता है, जिससे (xxx UNION yyy) ORDER BY zzz
निकोलस कैरी

39

यूनिअन में केवल पहले कथन के लिए इस प्रकार को लागू करने के लिए, आप इसे UNION ALL (ये दोनों Oracle में आवश्यक प्रतीत होते हैं) के साथ एक उप-अनुभाग में रख सकते हैं:

Select id,name,age FROM 
(    
 Select id,name,age
 From Student
 Where age < 15
 Order by name
)
UNION ALL
Select id,name,age
From Student
Where Name like "%a%"

या (निकोलस केरी की टिप्पणी को संबोधित करते हुए) आप गारंटी दे सकते हैं कि शीर्ष चयन का आदेश दिया गया है और परिणाम नीचे के ऊपर दिखाई देते हैं इस तरह का चयन करें:

Select id,name,age, 1 as rowOrder
From Student
Where age < 15
UNION
Select id,name,age, 2 as rowOrder
From Student
Where Name like "%a%"
Order by rowOrder, name

4
हाँ। जो उपशमन के परिणामों का आदेश देता है। यह selectकथन के परिणामों को आदेशित नहीं करता है जो कि अवचेतन को संदर्भित करता है। SQL मानक के अनुसार, परिणामों का क्रम एक स्पष्ट order byखंड को अपरिभाषित करता है । selectआपके उदाहरण में सबसे पहले शायद उपशीर्ष द्वारा लौटाए गए क्रम में इसके परिणाम आए, लेकिन इसकी गारंटी नहीं है। इसके अलावा, यह पूरे मानक के मानक सेट (मानक में समान नियम) के आदेश की * * नहीं * गारंटी देता है union। यदि आप आदेश के आधार पर हैं, तो आप - अंततः - काट लेंगे।
निकोलस कैरी

1
@ नाइकोलस कैरी - जब मैंने शुरू में एक यूनियन का उपयोग करके परीक्षण किया था तो यह अप्रत्याशित रूप से व्यवहार कर रहा था जैसा कि आपने वर्णित किया है, मुझे लगता है कि यूनिअन ऑल (कम से कम ओरेकल में) नीचे से ऊपर के शीर्ष का चयन करने के लिए आवश्यक था। हालाँकि मैंने एक ऐसा विकल्प प्रदान किया है जो सही क्रम की गारंटी देता है और डेटाबेस स्वतंत्र होना चाहिए।
बीए तब्बनबर

मेरे लिए काम नहीं कर रहा है। यूनिअन सब के साथ एक अभी भी पहले के भीतर आदेश बनाए रखने में विफल रहता है SELECT
अमित चिगदानी

और दूसरी क्वेरी के साथ समस्या यह है कि यह डुप्लिकेट रिकॉर्ड को खत्म नहीं करता है। क्योंकि आपने एक और कॉलम 'rowOrder' जोड़ा है, जो डुप्लिकेट रिकॉर्ड के खिलाफ अलग-अलग मूल्य हो सकता है। UNION ALL के खिलाफ UNION का उद्देश्य खो गया है।
अमित चिगदानी

1
@AmitChigadani डुप्लिकेट का उन्मूलन मूल प्रश्न का हिस्सा नहीं था, लेकिन ऐसा करने के लिए जहां अद्वितीयता को सुनिश्चित करने के लिए संशोधित किया जा सकता है। उदाहरण: जहां "% a%" और आयु> = 15
BA TabNabber

12

अन्य दोनों उत्तर सही हैं, लेकिन मुझे लगा कि यह ध्यान देने योग्य है कि जिस स्थान पर मैं फंस गया था, वह यह महसूस नहीं कर रहा था कि आपको उपनाम द्वारा आदेश की आवश्यकता होगी और सुनिश्चित करें कि उपनाम दोनों चयनों के लिए समान है ... इसलिए

select 'foo'
union
select item as `foo`
from myTable
order by `foo`

ध्यान दें कि मैं पहले चयन में सिंगल कोट्स का उपयोग कर रहा हूं लेकिन दूसरों के लिए बैकटिक्स।

वह आपको आपकी जरूरत के अनुसार छांट लेगा।


पहला चयन और दूसरे में backticks के साथ एकल उद्धरण का उपयोग करके आप क्या महत्वपूर्ण बनाना चाहते हैं? आदर्श रूप से यह सुसंगत होना चाहिए।
नैनोसॉफ्ट

पहला चयन एक शाब्दिक है; यह 'NAMES' जैसा हैडर है। दूसरा चयन एक तालिका का संदर्भ है। तो आपकी पहली पंक्ति "NAMES" कहेगी और बाकी पंक्तियाँ तालिका से चुने गए वास्तविक नाम होंगे। मुद्दा यह है कि आपका हैडर बहुत अच्छी तरह से उसी स्ट्रिंग का नाम हो सकता है जिसमें से आप जिस कॉलम का चयन कर रहे हैं और यह उस लेबल का उपयोग करने का उपाय है जिसे आप अपने यूनियन में टकराने के बिना चाहते हैं।
येवगेनी सिम्किन

2
कुछ प्रयोग के बाद मैं देखता हूं कि ORDER BY क्लॉज में उल्लिखित उपनाम का चयन सेलेक्ट क्लॉस में किया जाना चाहिए। आप किसी अन्य स्तंभ द्वारा सॉर्ट नहीं कर सकते। SELECT a, b, c FROM (<insert union query here>) AS x;यदि आप वास्तव में अतिरिक्त कॉलम को वापस करने से बचना चाहते हैं, तो बेशक आप इसके चारों ओर काम कर सकते हैं ।
वोडिन

11

Order Byके बाद लागू किया जाता है union, इसलिए order byबयानों के अंत में सिर्फ एक खंड जोड़ें :

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like '%a%'
Order By name

9

यदि मैं चाहता हूं कि यदि संघ सभी का उपयोग करता है तो केवल एक ही संघ के लिए लागू किया जाना चाहिए:

Select id,name,age
From Student
Where age < 15
Union all
Select id,name,age
From 
(
Select id,name,age
From Student
Where Name like "%a%"
Order by name
)

8

जैसा कि अन्य जवाबों में कहा गया है, 'यूनियन द्वारा आदेश' के बाद कम से कम यूनियन द्वारा शामिल दोनों डेटासेट पर लागू होना चाहिए।

मेरे पास दो डेटा सेट थे, लेकिन अलग-अलग तालिकाओं का उपयोग कर रहे थे लेकिन एक ही कॉलम। LAST Union के बाद भी 'ऑर्डर' ने काम नहीं किया। 'द्वारा क्रम' में उपयोग किए गए कॉलम के लिए ALIAS का उपयोग कर चाल चली।

Select Name, Address for Employee 
Union
Select Customer_Name, Address from Customer
order by customer_name;   --Won't work

तो समाधान का उपयोग उपनाम 'User_Name' है:

Select Name as User_Name, Address for Employee 
Union
Select Customer_Name as User_Name, Address from Customer
order by User_Name; 

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.