2013-03-06 9 views
10

मेरे पास कर्मचारियों के लिए एक टेबल है और प्रशिक्षण के साथ एक और तालिका है। प्रशिक्षण तालिका में विभिन्न प्रशिक्षण वर्ग शामिल हैं जो कर्मचारियों ने पूरा कर लिया है। हमारे पास अनिवार्य सुरक्षा जागरूकता प्रशिक्षण है, इसलिए प्रत्येक कर्मचारी को यह प्रशिक्षण कक्षा पूरी करनी होगी। मुझे एक प्रश्न चलाने में परेशानी हो रही है जो सभी कर्मचारियों को या तो प्रशिक्षण पूरा करने के लिए सूचीबद्ध करेगा या नहीं।एसक्यूएल क्वेरी कई रिश्तों के लिए

उदाहरण कर्मचारी तालिका

╔════╦══════╗ 
║ ID ║ NAME ║ 
╠════╬══════╣ 
║ 1 ║ Bob ║ 
║ 2 ║ Tom ║ 
║ 3 ║ John ║ 
╚════╩══════╩ 

उदाहरण प्रशिक्षण तालिका

╔════╦══════════════╦════════════════════╗ 
║ ID ║ DEPARTMENT_ID║  CLASS  ║ 
╠════╬══════════════╬════════════════════╣ 
║ 1 ║   1 ║ Security Awareness ║ 
║ 2 ║   1 ║ Workplace Safety ║ 
║ 3 ║   2 ║ Security Awareness ║ 
╚════╩══════════════╩════════════════════╝ 

लक्ष्य परिणाम

╔════╦══════╦════════════════════╗ 
║ ID ║ NAME ║  CLASS  ║ 
╠════╬══════╬════════════════════╣ 
║ 1 ║ Bob ║ Security Awareness ║ 
║ 2 ║ Tom ║ Security Awareness ║ 
║ 3 ║ John ║ (null)    ║ 
╚════╩══════╩════════════════════╝ 

क्वेरी है कि मैं उपयोग कर रहा हूँ

SELECT employee.id, employee.name, training.class 
FROM employee 
JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%SECURITY%' 
ORDER BY employee_id 
है 210

कर्मचारी "सुरक्षा जागरूकता" कक्षा गायब है, बस दिखाई नहीं देता है, और दरारों के माध्यम से गिरता है।

+1

department_id employee.id के बराबर है? – Maciej

उत्तर

10

उपयोग LEFT JOIN है

WHERE training.Id = 1 

करने के लिए अपने कहां खंड बदल सकते हैं और तालिका के शामिल होने के दौरान (विशेष रूप से ON खंड में) छानने हालत के लिए कदम

एक और चाहते हैं चिंता एकल उद्धरण का उपयोग करती है: ' '‘ ’

SELECT employee.id, 
     employee.name, training.class 
FROM employee 
     LEFT JOIN training 
      ON employee.id = training.department_id AND 
       training.class LIKE '%SECURITY%' 
ORDER BY employee.id 

परिणाम

╔════╦══════╦════════════════════╗ 
║ ID ║ NAME ║  CLASS  ║ 
╠════╬══════╬════════════════════╣ 
║ 1 ║ Bob ║ Security Awareness ║ 
║ 2 ║ Tom ║ Security Awareness ║ 
║ 3 ║ John ║ (null)    ║ 
╚════╩══════╩════════════════════╝ 
+3

बहुत अच्छा, मुझे नहीं पता था कि मैं शामिल होने के भीतर फ़िल्टर कर सकता हूं। इससे अन्य क्षेत्रों में भी मदद मिलेगी। – Rich

+0

मेरे पास एक और स्पष्टीकरण है http://stackoverflow.com/a/15205900/491243 –

1

आप एक आंतरिक शामिल हो रहे हैं, जो आप चाहते हैं वह बाएं बाहरी जुड़ना है। अंतर यह है: एक आंतरिक जुड़ाव केवल परिणाम होगा जहां शामिल तालिका में एक मैच है। एक बायां बाहरी जुड़ाव प्राथमिक तालिका से सभी परिणामों को वापस कर देगा, चाहे जुड़े हुए तालिका में नतीजे हों या नहीं।

+0

बिलकुल नहीं .. यह काम नहीं करेगा –

0

जो आप खोज रहे हैं उसे बाहरी शामिल किया जाता है। इस मामले में आपको बाएं बाहरी जुड़ने की आवश्यकता होगी:

SELECT employee.id, employee.name, training.class 
FROM employee LEFT OUTER JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%Security%' 
ORDER BY employee_id 
0

जॉइन उपयोग के बजाय बाएं बाहरी जॉइन का उपयोग करें। मैं भी है कि अगर बराबर

0
Select e.id, e.name, t.class from employee e left outer join training t on e.id = t.department_id where t.class like '%Security%' order by e.id 
संबंधित मुद्दे