2012-11-25 7 views
13

क्या mysql मैं इन दी 2 टेबल के नीचे परिणाम प्राप्त करने की आवश्यकता है:MySQL सच पंक्ति मर्ज ... न सिर्फ एक संघ

table1:

+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | alan | 
| 2 | bob | 
| 3 | dave | 
+----+-------+ 

table2:

+----+---------+ 
| id | state | 
+----+---------+ 
| 2 | MI  | 
| 3 | WV  | 
| 4 | FL  | 
+----+---------+ 

मैं एक अस्थायी दृश्य बनाना चाहता हूं जो इस

वांछित परिणाम:

+----+---------+---------+ 
| id | name | state | 
+----+---------+---------+ 
| 1 | alan |   | 
| 2 | bob  | MI  | 
| 3 | dave | WV  | 
| 4 |   | FL  | 
+----+---------+---------+ 

मैंने एक MySQL संघ की कोशिश की लेकिन निम्नलिखित परिणाम मैं नहीं चाहता हूं।

create view table3 as 
(select id,name,"" as state from table1) 
union 
(select id,"" as name,state from table2) 

table3 संघ परिणाम:

+----+---------+---------+ 
| id | name | state | 
+----+---------+---------+ 
| 1 | alan |   | 
| 2 | bob  |   | 
| 3 | dave |   | 
| 2 |   | MI  | 
| 3 |   | WV  | 
| 4 |   | FL  | 
+----+---------+---------+ 
+0

बहुत अच्छा प्रदर्शन और समस्या +1 की परिभाषा – SaidbakR

उत्तर

9

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

जॉइन एसक्यूएल भाषा का एक मौलिक हिस्सा है, जितना थोड़ी देर लूप अन्य प्रोग्रामिंग भाषाओं के लिए है।

यहाँ प्रारंभ: A Visual Explanation of SQL Joins

बनाम संघ में शामिल होने के बारे में सोच का एक और तरीका है:

  • यूनिअन कतारें लग जोड़ देता है।
  • जॉइन एक साथ स्तंभ जोड़ता है।

उदाहरण के लिए:

SELECT * 
FROM table1 
JOIN table2 USING (id); 

इस में शामिल होने कि रिटर्न केवल पंक्तियों जो के लिए एक मिलान आईडी दोनों तालिकाओं में मौजूद है की एक शैली है। लेकिन आप उन सभी आईडी चाहते हैं जिनके लिए कम से कम एक तालिका या दूसरी पंक्ति में एक पंक्ति मौजूद है।

SELECT * 
FROM table1 
LEFT OUTER JOIN table2 USING (id); 

यह table2 में उनसे मिलते-जुलते पंक्तियों के साथ, table1 से सभी पंक्तियों हो जाता है। लेकिन रिवर्स प्राप्त करने के लिए, हम आवश्यकता होगी:

SELECT * 
FROM table1 
RIGHT OUTER JOIN table2 USING (id); 

एसक्यूएल भी परिभाषित करता है एक पूर्ण बाहरी शामिल हों जो दोनों एक ही बार में करना होगा, लेकिन दुर्भाग्य से MySQL SQL मानक के इस भाग को लागू नहीं किया। लेकिन हम दो प्रकार के जोड़ों को गठबंधन करने के लिए UNION का उपयोग कर सकते हैं। संघ डिफ़ॉल्ट रूप से डुप्लिकेट पंक्तियों को खत्म कर देगा।

अपडेट: मैं इसे परेशान करता हूं, और इसे काम करने के लिए मिला। यह पता चला है कि आपको कॉलम को स्पष्ट रूप से नाम देना होगा, यह सुनिश्चित करने के लिए कि वे दोनों संघीय प्रश्नों में एक ही कॉलम में हैं। क्वेरी कि काम करता है, मेरी टर्मिनल विंडो से नकल है:

SELECT id, name, state 
FROM table1 
LEFT OUTER JOIN table2 USING (id) 
UNION 
SELECT id, name, state 
FROM table1 
RIGHT OUTER JOIN table2 USING (id); 

यह सामान्य SELECT * का उपयोग कर से बचने के लिए एक अच्छी आदत है, और इस बस एक और मामले में जहां यह एक अच्छा विचार है।

इसके अलावा, मैंने पहले क्वेरी उदाहरण में एक अतिसंवेदनशील अर्धविराम छोड़ा था। यह मेरे हिस्से पर सिर्फ एक टाइपो था।

+----+------+-------+ 
| id | name | state | 
+----+------+-------+ 
| 1 | alan | NULL | 
| 2 | bob | MI | 
| 3 | dave | WV | 
| 4 | NULL | FL | 
+----+------+-------+ 

पुनश्च:: इतनी स्पष्ट रूप से सवाल पूछने के लिए धन्यवाद

इस क्वेरी निम्नलिखित उत्पादन, मेरे टर्मिनल विंडो से नकल का उत्पादन!

+0

परिणाम करीब लगता है, लेकिन नहीं वांछित परिणाम से ऊपर का उल्लेख है। स्वरूपण इस टिप्पणी में समान नहीं है, इसलिए मैंने परिणाम में परिणाम चिपकाया। – panofish

+0

@panofish 'चयन करें * तालिका 1 से बाएं जॉइन टेबल 2 चालू (table1.id = table2.id) यूनियन चुनें * तालिका 1 से दाएं तालिका 2 में शामिल हों (table1.id = table2.id) मूल रूप से बिलकार्विन के अनुसार क्या है लेकिन प्राप्त करता है थोड़ा अलग परिणाम .. आपको और अधिक आवश्यकता हो सकती है। – Pebbl

+0

करीब है लेकिन अभी भी वांछित तालिका का उत्पादन नहीं करता है ... शायद यह एक उदाहरण है जिसे प्रोग्रामेटिक रूप से ही किया जा सकता है? – panofish

0

आप FULL OUTER JOIN की जरूरत है:

SELECT coalesce(a.id, b.id), a.name, b.state 
FROM table1 a 
FULL OUTER JOIN table2 b ON (a.id = b.id) 
+3

MySQL 'पूर्ण बाहरी जॉइन' –

+0

yup का समर्थन नहीं करता है ... पूर्ण बाहरी जॉइन mysql में काम नहीं करता है – panofish

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