SQL क्वेरी - UNION में ऑर्डर का उपयोग करके


83

दो टेबलों से डेटा खींचते समय कोई प्रोग्राम क्वेरी कैसे क्रमित कर सकता है? उदाहरण के लिए,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

एक अपवाद फेंकता है

नोट: यह एमएस एक्सेस जेट डेटाबेस इंजन पर प्रयास किया जा रहा है

जवाबों:


118

कभी-कभी आपको ORDER BYउन सभी वर्गों में होना चाहिए जिनके साथ संयुक्त होने की आवश्यकता है UNION

इस मामले में

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

1
मेरे लिए तब काम किया जब परिणाम सेट को प्रभावित करता है (जैसा कि टॉप x का उपयोग करते समय)
जेम्स बैराज़

यह वही है जिसकी मुझे तलाश है! धन्यवाद!
श्रीचंद येला

मेरे लिए बहुत अच्छा काम करता है ... आपको यह सुनिश्चित करने की ज़रूरत है कि बाहरी चयन में एक तालिका उपनाम है। वह मुझे थोड़ा।
ट्रॉय

Microsoft SQL सर्वर मानक (64-बिट) संस्करण 11.0.5058.0 के साथ इस सिंटैक्स का उपयोग करने में मुझे कोई समस्या नहीं हुई।
होवडाल

3
SSMS में आपको सब-क्वेरीज़ को एक उप-क्वेरी में SELECT TOP 100 PERCENTउपयोग करने के लिए बदलना होगाORDER BY
जोसेफ नीड्स

64
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

18
यह तकनीकी रूप से पूरा नहीं करता है कि आप मूल प्रश्न में तार्किक रूप से क्या पूछ रहे थे।
इयान बॉयड

2
@ इयान बॉयड: मैं आपकी बात मानता हूं लेकिन वे जो पूछ रहे हैं उसका कोई तार्किक अर्थ नहीं है: संघ सेट पर काम करता है और सेट का कोई आदेश नहीं है!
onedaywhen

8
@onedaywhen मूल लेखक परिणामों के दो क्रमबद्ध सेटों को संक्षिप्त करना चाहता है। UNIONऐसा करने की अनुमति नहीं देता है। इसे करने के लिए एक और निर्माण हो सकता है। नहीं हो सकता है। किसी भी तरह से यह जवाब तकनीकी रूप से पूरा नहीं करता है कि लेखक क्या पूछ रहा था।
इयान बोयड

4
@ इयान बॉयड: एसक्यूएल में, ORDER BYएक कर्सर का हिस्सा है, जबकि UNIONटेबल पर काम करता है, इसलिए उनका कोड काम नहीं कर सकता है। मैं यह नहीं देख सकता कि आप बेतुके कोड से ओपी के इरादे का कैसे पता लगा सकते हैं। विचार करें कि एसक्यूएल UNIONडुप्लिकेट को हटाता है: यदि ये आपके "परिणामों के आदेशित सेट" {1, 2, 3} UNION {2, 4, 6}हैं {1, 2, 3, 4, 6}या परिणाम होगा {1, 3, 2, 4, 6}? हमें पता नहीं है क्योंकि "ऑर्डर के सेट के परिणाम" का संघ SQL के संबंध में अपरिभाषित है और ओपी ने निर्दिष्ट नहीं किया है।
onedaywhen

मैं MYSQL का उपयोग कर रहा हूं, मैंने सभी चुनिंदा बयानों में फ़ील्ड (ऑर्डरिंग फ़ील्ड) को शामिल किया है। फिर अंत में मेरे द्वारा ऑर्डर जोड़ा गया, मेरे लिए ठीक काम करता है।
क्रिएटिवमनिक्स

57

मुझे लगता है कि यह समझाने का एक अच्छा काम करता है।

निम्नलिखित एक यूनिअन क्वेरी है जो ORDER BY क्लॉज का उपयोग करता है:

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

चूंकि कॉलम के नाम दो "चयन" बयानों के बीच भिन्न होते हैं, इसलिए परिणाम सेट में उनकी स्थिति से ORDER BY क्लॉज में कॉलम को संदर्भित करना अधिक फायदेमंद होता है।

इस उदाहरण में, हमने "ORDER BY 2" द्वारा निरूपित के रूप में supplier_name/ company_nameआरोही क्रम में परिणामों को क्रमबद्ध किया है।

supplier_name/ company_nameक्षेत्रों परिणाम सेट में स्थिति # 2 में हैं।

यहां से लिया गया: http://www.techonthenet.com/sql/union.php


28

एक ठोस उदाहरण का उपयोग करना:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

फ़ाइलें:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

फ़ोल्डर:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

वांछित आउटपुट: (पहले चयन के परिणाम पहले, अर्थात पहले फ़ोल्डर)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

वांछित परिणाम प्राप्त करने के लिए SQL:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

3
यह अब तक का सबसे अच्छा उत्तर है
javier_domenech

1
यह महान जवाब है!
अली गोनाबादी

नोट - आपको व्युत्पन्न तालिका को एक उपनाम देना चाहिए (जैसा कि इस उदाहरण में दिखाया गया है dt) या यह काम नहीं करेगा। मैं थोड़ी देर के लिए इस से हैरान था, क्योंकि मैं उस विस्तार को शुरू करना चाहता था और SSMS द्वारा फेंका गया त्रुटि संदेश विशेष रूप से उपयोगी नहीं है।
कैक्टसकेक

17

यहाँ नॉर्थविंड 2007 से एक उदाहरण है:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

आपके द्वारा अपनी सारी यूनियनिंग के बाद ORDER BY क्लॉज़ को केवल अंतिम कथन होना चाहिए। आप कई सेट एक साथ कर सकते हैं, फिर अंतिम सेट के बाद ORDER BY क्लॉज लगा सकते हैं।


9
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

काम? याद रखें सेट लगता है। उस सेट को प्राप्त करें जिसे आप एक संघ का उपयोग करना चाहते हैं और फिर उस पर अपना संचालन करें।


तुम भी क्रमसूचक मूल्यों अपने आदेश में खंड द्वारा मामले में खेतों आप प्रकार पर करना चाहते हैं का उपयोग कर सकते अलग ढंग से नाम हैं
एंसन स्मिथ

5
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC

4
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(ALIAS का उपयोग करें)


@DisplacedGuy अगर MJ के पास किसी प्रश्न का बेहतर उत्तर है तो उपरोक्त में से कोई भी, और इस मामले में स्वीकृत उत्तर में स्पष्ट रूप से समस्याएं हैं, तो MJ को सक्षम होना चाहिए और मैं उसे नए उत्तर छोड़ने के लिए प्रोत्साहित करता हूं
MobileMon

और btw, एमजे का जवाब सबसे अच्छा है! (मेरे लिए कम से कम)
MobileMon

4

यह मैंने कभी देखा है, लेकिन यह काम करता है, और आप परिणामों के साथ बहस नहीं कर सकते।

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

व्युत्पन्न तालिका का इंटीरियर अपने दम पर निष्पादित नहीं करेगा, लेकिन जैसा कि एक व्युत्पन्न तालिका पूरी तरह से ठीक काम करती है। मैंने एसएस 2000, एसएस 2005, एसएस 2008 आर 2 और तीनों काम पर यह कोशिश की है।


2

इस तरह से किया जाता है

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B

2

इस टिप्पणी अनुभाग को ब्राउज़ करते हुए मैं प्रश्न का उत्तर देने वाले दो अलग-अलग पैटर्न के पार आया। अफसोस की बात है कि एसक्यूएल 2012 के लिए, दूसरा पैटर्न काम नहीं करता है, इसलिए यहां मेरा "आसपास काम" है


ऑर्डर ऑन कॉमन कॉलम

यह सबसे आसान मामला है जिससे आप मुठभेड़ कर सकते हैं। जैसे कई उपयोगकर्ता बताते हैं, आपको वास्तव Order Byमें क्वेरी के अंत में जोड़ने की आवश्यकता है

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

या

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

अलग कॉलम पर आदेश

यहाँ है जहाँ यह वास्तव में मुश्किल हो जाता है। SQL 2012 का उपयोग करते हुए, मैंने शीर्ष पद की कोशिश की और यह काम नहीं करता है।

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

टिप्पणी में सिफारिश के बाद मैंने यह कोशिश की

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

इस कोड को संकलित लेकिन था DUMMY_ALIAS1और DUMMY_ALIAS2ओवरराइड Order Byमें स्थापित किया गया Selectबयान जो इस व्यर्थ बनाता है।

एकमात्र उपाय जो मैं सोच सकता था, मेरे लिए काम करने वाला संघ का उपयोग नहीं कर रहा था और इसके बजाय प्रश्नों को व्यक्तिगत रूप से चला रहा था और फिर उनके साथ काम कर रहा था। इसलिए मूल रूप से, Unionजब आप चाहें का उपयोग नहीं कर रहे हैंOrder By


1

अलग से ऑर्डर का उपयोग करने से प्रत्येक सब्मिट को ऑर्डर मिलता है, लेकिन पूरे सेट को नहीं, जो कि आप दो टेबल को एकजुट करना चाहते हैं।

आपको कुछ इस तरह का उपयोग करना चाहिए कि एक सेट का आदेश दिया जाए:

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC

0

दूसरी तालिका में ORDER BYखंड में तालिका का नाम शामिल नहीं किया जा सकता है ।

इसलिए...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

अपवाद नहीं फेंकता


यह कितना अच्छा सवाल था। क्या आप बता सकते हैं कि क्या आपका संस्करण, या नेस्टेड, वांछित परिणाम लौटाता है? या, क्या वे दोनों एक ही परिणाम लौटाते हैं? यदि ऐसा है, तो (दूसरे आदमी का) नेस्टेड समाधान अधिक प्रदर्शनकारी होगा क्योंकि यह केवल एक बार ORDER करता है?
डीओके

मुझे यकीन नहीं है कि जेट इंजन पर प्रदर्शन लाभ होगा, लेकिन मैं कहूंगा कि घोंसले के कारण पठनीयता बढ़ गई है।
कर्टिस इण्डरवीश

0

यदि आंतरिक छँटाई रखना आवश्यक हो:

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1

0
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

इसे इस्तेमाल करे। इसने मेरे लिए काम किया।


0

Sql सर्वर 2014/2012 / अन्य के लिए (चेक नहीं किया गया):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2

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