2009-06-16 9 views
13

मेरे पास एक प्रश्न है कि यूनियन दो समान समान डेटासेट हैं, लेकिन दोनों में कुछ कॉलम हैं जो दूसरे में मौजूद नहीं हैं - यानी कॉलम के परिणामस्वरूप यूनियन में कुल मान हैं। यूनियन का उद्देश्य सॉफ्टवेयर-साइड के लिए एक दोस्ताना प्रारूप में डेटा प्राप्त करना है।अलग-अलग डेटासेट्स के यूनियन के साथ TSQL ORDER-BY

समस्या यह है कि मुझे उन स्तंभों का उपयोग करके परिणामी डेटा को ऑर्डर करना होगा जो केवल एक या दूसरे सेट में मौजूद हैं।

उदाहरण के लिए: तालिका 1 में फ़ील्ड आईडी, बिल्ली, मूल्य है। तालिका 2 में फ़ील्ड आईडी है (तालिका 1 में समान), नाम, अब्रब्र।

मेरे क्वेरी कुछ इस तरह दिखाई देता है:

SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1
UNION
SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2
ORDER BY Price DESC, Abbrv ASC

आदेश के द्वारा होता है, जहां मैं अटक कर रहा हूँ। डेटा इस तरह दिखता है:
100---Balls-----1.53----------------------
200---Bubbles---1.24----------------------
100---------------------RedBall----101RB--
100---------------------BlueBall---102BB--
200---------------------RedWand----201RW--
200---------------------BlueWand---202BW--

लेकिन मैं इसे इस तरह दिखना चाहते हैं:
100---Balls-----1.53----------------------
100---------------------RedBall----101RB--
100---------------------BlueBall---102BB--
200---Bubbles---1.24----------------------
200---------------------RedWand----201RW--
200---------------------BlueWand---202BW--

(क्षमा याचना अगर उन को पढ़ने के लिए मुश्किल है - फ्लॉप और कैसे एक मेज पर बुलाने के)

ध्यान रखें कि यह बहुत डंबेड-डाउन उदाहरण और कहानियों "जॉइन का उपयोग करें!" उत्तर लागू नहीं है (यानी मुझे पहले से ही पता है कि उन्हें कैसे शामिल किया जाए लेकिन यह नतीजा है कि मैं अंत परिणाम में क्या चाहता हूं)।

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

+0

क्या आईडी आपके टी 2 उत्पादों को टी 1 उत्पाद से लिंक नहीं करती है? यदि आपको नहीं पता कि RedWand & BlueWand सीधे बुलबुले के बाद आते हैं? – mundeep

+0

वह इस सवाल में कहता है: "तालिका 2 में फ़ील्ड आईडी है (तालिका 1 में जैसी)" –

+0

सभी उत्तरों के लिए धन्यवाद; यह सिर्फ मेरा पहला सवाल है, लेकिन यह पहले से ही एक महान समुदाय की तरह लगता है। साथ ही, उन लोगों के लिए जो 'वास्तुकला' की आलोचना करेंगे, मेरा प्रश्न तात्पर्य है - कृपया ध्यान दें कि मैंने स्वीकार किए गए उत्तर में ऊपर और नीचे क्या कहा है: यह बेवकूफ उदाहरण है! मेरे प्रश्न में 'टेबल' वास्तव में दो बहुत जटिल चयन प्रश्नों का प्रतिनिधित्व करता है जिनमें समेकित और गणना किए गए फ़ील्ड के साथ कई तालिकाओं और सबक्वायरी शामिल हैं। एक बार फिर धन्यवाद! – NateJ

उत्तर

22
Select ID, Cat, Price, Name, Abbrv 
From 
(SELECT t1.ID, t1.Cat, t1.Price, t1.Price AS SortPrice, NULL as Name, NULL as Abbrv 
FROM t1 
UNION 
SELECT t2.ID, NULL as Cat, NULL as Price, t1.Price as SortPrice, t2.Name, t2.Abbrv 
    FROM t2 
    inner join t1 on t2.id = t1.id 
) t3 
ORDER BY SortPrice DESC, Abbrv ASC 

किसी भी तरह आपको तालिका 2 में डेटा पता होना चाहिए तालिका 1 से जुड़ा हुआ है और कीमत साझा करें। चूंकि abbrv में नल पहले आ जाएगा, SortAbbrv कॉलम बनाने की कोई आवश्यकता नहीं है।

+3

इस क्वेरी को चलाने से एक वाक्यविन्यास त्रुटि उत्पन्न होती है जब तक कि उपक्वायरी में उपनाम नहीं होता है। मैंने आपके लिए सुधार किया है। +1 –

+0

सही, इसलिए अनिवार्य रूप से यह कीमत को दूसरी क्वेरी में डाल रहा है ताकि इसे हल किया जा सके। यह _would_ एक अच्छा समाधान हो सकता है यदि वास्तविक क्वेरी पहले से इतनी जटिल नहीं थी - इसमें सबक्वायरीज़ और कुल और गणना की गई फ़ील्ड हैं, जिनमें से एक प्राथमिक सॉर्ट-एर (यानी इस मामले में मूल्य) है। मुझे वास्तव में क्या करना होगा यूनियन के निचले हिस्से में जॉइन के लिए फिर से पूरी पहली क्वेरी डुप्लिकेट करें। तो +1 और स्वीकार किया गया, लेकिन मैं इस तरह काम करने वाली असली चीज़ पाने की कोशिश करने में और अधिक समय बर्बाद नहीं कर रहा हूं; कोड में डेटा और संभवतः क्लीनर में हेरफेर करना कहीं अधिक आसान है। – NateJ

+0

+1 अच्छा उत्तर जेफ ओ – Catto

1

एक त्वरित समाधान एक टेम्पलेट टेबल या तालिका चर में 2 आवेषण करना होगा और अस्थायी तालिका में डालने के हिस्से के रूप में आप सॉर्टिंग के साथ मदद करने के लिए ध्वज कॉलम सेट कर सकते हैं और फिर उस ध्वज कॉलम द्वारा ऑर्डर कर सकते हैं।

+0

मैंने इसके बारे में सोचा, लेकिन इससे बचने की कोशिश की। अच्छा जवाब हालांकि। – NateJ

0

मेरे सिर के ऊपर से मैं कहूंगा कि सबसे खराब स्थिति परिदृश्य है कि आप सभी क्षेत्रों के साथ एक अस्थायी तालिका बनाते हैं, दोनों टीटी 2 से अस्थायी तालिका में एक इंसर्ट करते हैं, फिर ऑर्डर के साथ temp तालिका से चुनें।

यानी। खेतों क्रमांक, बिल्ली, मूल्य, नाम, Abbrv के साथ एक अस्थायी तालिका (। जैसे #temp) बनाएँ, और उसके बाद:

SELECT Id, Cat, Price, null, null INTO #temp FROM T1 
SELECT Id, null, null, Name, Abbrv INTO #temp FROM T2 
SELECT * FROM #temp ORDER BY Id, Price DESC, Abbrv ASC 

एनबी: मैं आवेषण लेकिन मैं से अशक्त वाक्य रचना पर 100% यकीन नहीं है लगता है कि यह काम करेगा।

संपादित करें: आईडी & आईडी के बाद Abbrv द्वारा क्रमबद्ध क्रमबद्ध ... यदि आईडी T1 & T2 लिंक नहीं करता है तो क्या करता है?

+0

आईडी को अनदेखा करें; मूल्य प्राथमिक ऑर्डर-एर है। – NateJ

2

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

SELECT * 
FROM 
(
SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1 
UNION ALL 
SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2 
) as sub 
ORDER BY 
    ID, 
    CASE WHEN Price is not null THEN 1 ELSE 2 END, 
    Price DESC, 
    CASE WHEN Abbrv is not null THEN 1 ELSE 2 END, 
    Abbrv ASC 
+0

असली क्वेरी जो मैं काम कर रहा हूं, में यूनियन ऑल है। एक बार फिर, आईडी प्राथमिक ORDER-er नहीं है, मूल्य है। आईडी का उपयोग 'वास्तविक' क्वेरी में सॉर्ट करने के लिए नहीं किया जा सकता है जिसका मैं आधार बना रहा हूं। – NateJ

संबंधित मुद्दे