तीन तालिकाओं में शामिल नहीं हो सकते हैं और केवल एक से सभी रिकॉर्ड वापस कर सकते हैं

मैं सामान्य रूप से, SQL सर्वर एक्सप्रेस 2012 और एसएस प्रबंधन स्टूडियो और डेटाबेस के लिए बहुत नया उपयोग कर रहा हूं। अधिक समय और शोध के बावजूद, मैं एक विशेष संग्रहित प्रक्रिया के साथ अपने लक्ष्य को काफी हासिल नहीं कर सकता हूं और बिना किसी सलाह के आगे बढ़ सकता हूं।

मैं तीन संबंधित टेबल्स ए, बी और सी से डेटा पुनर्प्राप्त करना चाहता हूं। मैं टेबलए से सभी पंक्तियां और टेबल टेबल और टेबलसी (यदि वे मौजूद हैं) से संबंधित प्रासंगिक पंक्तियां चाहते हैं।

मुझे StackOverflow पर यह लिंक मिला जो मेरी समस्या का सबसे नज़दीकी मैच था, जिसे मैंने सफलता के बिना प्रयास किया है। कोड स्निपेट निम्नानुसार है:

SELECT A.*
FROM
  (TableA A LEFT JOIN TableB B ON A.id = B.a_id)
  LEFT JOIN TableC C ON A.id = C.a_ID 

अब, इस कोड में टेबलबी (बीए_आईडी) और टेबलसी (सीए_आईडी) के लिए संबंधित "आईडी" फ़ील्ड हैं जो टेबलए (एआईडी) से संबंधित हैं।

मेरे मामले में, टेबलए टेबलबी से संबंधित है और टेबलसी टेबलबी से संबंधित है। यह टेबलए के सभी रिकॉर्ड है कि मैं प्रत्येक टेबलए रिकॉर्ड के लिए अन्य दो तालिकाओं से केवल कुछ वर्णनात्मक फ़ील्ड के साथ लौटना चाहता हूं। मैं आवश्यकता के मुकाबले ज्यादा रिकॉर्ड लौटा रहा हूं, इसलिए मैं आउटपुट को केवल टेबलए में रिकॉर्ड कैसे फ़िल्टर करूं?

क्या कोई सुझाव दे सकता है कि कृपया इसे हल करने के लिए मुझे क्या करना चाहिए।

महत्वपूर्ण संपादन

क्षमा करें हर कोई - बस अपने उत्कृष्ट प्रतिक्रियाओं को पढ़ने से स्पष्ट करने के लिए ..

मैं केवल टेबल में सभी पंक्तियों को वापस करना चाहता हूं। मैं इनमें से प्रत्येक पंक्ति के लिए उचित कॉलम वापस करने के लिए टेबलबी और टेबलसी समेत हूं।

अधिक जानकारी संपादित करें

सरल शब्दों में मेरा संदर्भ इस जैसा है:

टेबलए कर्मचारियों की एक सारणी है। इसमें दो कॉलम हैं: कर्मचारी आईडी, कर्मचारी नाम

टेबलबी विभागों की एक सारणी है। इसमें तीन कॉलम विभाग, विभाग नाम, कर्मचारी आईडी हैं

टेबलसी फर्मों की एक मेज है। इसमें तीन कॉलम फर्मिड, फर्मनाम, विभाग हैं

मैं एक सूची बॉक्स (एक्सेल वीबीए में) में डाल करने के लिए सभी कर्मचारियों (यानी टेबलए में सभी पंक्तियों) की एक सूची चाहता हूं, जिससे उपयोगकर्ता चुन सकते हैं। सूची बॉक्स में मैं टेबलबी और टेबलसी से उपयोगकर्ता संबंधित कॉलम दिखाना चाहता हूं:

कर्मचारी आईडी, कर्मचारी नाम, फर्मनाम, विभाग नाम

मैं इसे प्राप्त करने के लिए तर्क और क्वेरी कोड की तलाश में हूं

0
मेरे संदर्भ के लिए कर्मचारी केवल एक विभाग/फर्म से संबंधित होगा
जोड़ा लेखक barryleajo, स्रोत
@ जेन धन्यवाद। 'आंकड़े' के नीचे xxMUROxx पर टिप्पणी के अनुसार टेबलए = 4 पंक्तियां, टेबलबी = 3 पंक्तियां, टेबलसी = 3 पंक्तियां हैं और मैं क्वेरी से 7 पंक्तियां वापस कर रहा हूं। मेरा संदर्भ एक्सेल वीबीए से इस क्वेरी/स्पोक को कॉल कर रहा है ताकि परिणाम वीबीए सूची बॉक्स को पॉप्युलेट कर सकें, जिससे उपयोगकर्ता चयन कर सकता है। मैं टेबलए से सभी पंक्तियों को वापस करना चाहता हूं और टेबल्स बी और सी से इन पंक्तियों में से प्रत्येक के लिए कुछ और कॉलम जानकारी वापस करना चाहता हूं। मैं बहुत ही जटिल किराया सोचता हूं, फिर भी यह बहुत जटिल लग रहा है।
जोड़ा लेखक barryleajo, स्रोत
धन्यवाद @ जेन, मैंने जॉइन और इनर जॉइन दोनों की कोशिश की है लेकिन मैं अभी भी टेबलए की तुलना में अधिक पंक्तियों को वापस कर रहा हूं। नीचे xxMUROxx के जवाब भी देखें
जोड़ा लेखक barryleajo, स्रोत
@ रॉबर्टो हां मैंने अपने स्वयं के चयन कथन में आवश्यक कॉलम निर्दिष्ट किए हैं। ए * उदाहरण में निर्दिष्ट सामान्य मामला था, जो कि अल्पसंख्यक के लिए, मैंने अभी छोड़ा था। मैं जिस कॉलम की ज़रूरत है उसे वापस कर सकता हूं, मैं बस बहुत सारी पंक्तियां लौट रहा हूं।
जोड़ा लेखक barryleajo, स्रोत
@Zane ए भूल जाओ * यह सिर्फ उदाहरण था। मैं उन सभी कॉलमों को वापस कर सकता हूं जिन्हें मुझे तीनों तालिकाओं से चाहिए, लेकिन मैं केवल पंक्तियों को लौटा देना चाहता हूं जो टेबलए में हैं। वर्तमान में मैं इससे अधिक पंक्तियां वापस कर रहा हूं।
जोड़ा लेखक barryleajo, स्रोत
@ मैथेसे एफ मैंने कोशिश की है लेकिन अभी भी टेबलए की तुलना में अधिक रिकॉर्ड लौटाते हैं।
जोड़ा लेखक barryleajo, स्रोत
आपके जवाबों के लिए शुक्रिया।
जोड़ा लेखक barryleajo, स्रोत
आप पंक्तियों का जिक्र करते हैं, लेकिन फिर कहें कि आपको बस दो अन्य तालिकाओं से कुछ फ़ील्ड चाहिए - तो, ​​आपको कॉलम के बारे में बात करनी होगी? यदि आपने, आपने निर्दिष्ट नहीं किया है कि आपको कौन से कॉलम चाहिए। आपकी क्वेरी (अब तक) केवल ए (ए *) से सबकुछ वापस लौटती है
जोड़ा लेखक Roberto, स्रोत
नमूना डेटा और वांछित परिणाम दिखाएं। समस्या का आपका विवरण टीएल; डीआर है।
जोड़ा लेखक Aaron Bertrand, स्रोत
यदि आपके पास EmployeeID = 123 के साथ कर्मचारियों में एक पंक्ति है और उसी कर्मचारी के साथ विभाग में दो पंक्तियां हैं, तो दोनों में से कौन सा आउटपुट के लिए चुना जाना चाहिए? यह निर्धारित करने के लिए क्या मानदंड/मानदंड का उपयोग किया जाना चाहिए? यदि आप दोनों विभागों की पंक्तियों को वापस करते हैं, तो कर्मचारी पंक्ति दो बार वापस कर दी जाएगी।
जोड़ा लेखक Andriy M, स्रोत
@barryleajo आपको अधिक रिकॉर्ड मिल रहे हैं क्योंकि आपके JOIN ed तालिकाओं में से एक JOIN कुंजी के लिए कई मान हैं। यदि आपके पास 1 में 1 का एक आईडी है और 1 की आईडी के साथ दो पंक्तियां tableB में हैं तो आप अपने परिणाम सेट में उस आईडी के साथ 2 पंक्तियां वापस प्राप्त करें चाहे आप किस तरह के शामिल हों।
जोड़ा लेखक JNK, स्रोत
आप अभी भी कर सकते हैं: tablea से एक। *, C.desc का चयन करें a.id = b.id पर tableb b में बाएं शामिल हों bsubid = c.subid पर tablec c में शामिल हों
जोड़ा लेखक Mathese F, स्रोत
एक टैबलेट से COUNT (*) चुनें फिर एआईडी = बी पर एआईडी = बीआईडी ​​इनर जॉइन टैबलेट पर टेबल एनेर जॉइन टैबलेट से चुनें COUNT (*) करें। आईडी या जो भी आपकी क्वेरी है। मायने रखता है क्या?
जोड़ा लेखक Zane, स्रोत
फिर आप INNER JOIN बाएं जॉइन नहीं करना चाहते हैं
जोड़ा लेखक Zane, स्रोत
ए। * का मतलब है कि आप केवल तालिका ए से ही लेंगे। मुझे यकीन नहीं है कि आप कौन से अन्य परिणाम खोज रहे हैं, कृपया अपना प्रश्न संपादित करें और पुनः प्रयास करें।
जोड़ा लेखक Zane, स्रोत

2 उत्तर

जब आप टेबल में शामिल होते हैं, तो आपको अलग-अलग पंक्तियों में अलग-अलग तालिकाओं से रिकॉर्ड नहीं मिलेंगे, आप सभी तालिकाओं से डेटा को उसी परिणाम पंक्ति में लाएंगे।

बस SELECT में तालिका से इच्छित फ़ील्ड को शामिल करें:

SELECT
  A.*,
  B.Something,
  C.Something
FROM
  TableA A
  LEFT JOIN TableB B ON A.id = B.a_id
  LEFT JOIN TableC C ON A.id = C.a_ID

ध्यान दें कि आपको हमेशा TableB और TableC तालिकाओं के लिए एक मान प्राप्त होगा, यानी परिणाम हमेशा कॉलम की एक ही संख्या है। यदि TableB या TableC से कोई संबंधित रिकॉर्ड नहीं है, तो परिणाम में वह फ़ील्ड null होगा।

(नोट भी; * SELECT में वास्तविक एप्लिकेशन कोड के लिए अच्छा अभ्यास नहीं है। आपको उन फ़ील्ड को निर्दिष्ट करना चाहिए जिन्हें आप अंतिम कोड में एक तालिका से चाहते हैं।)

संपादित करें:

यदि आपके पास TableA या TableC में प्रत्येक रिकॉर्ड के लिए TableA में एक से अधिक रिकॉर्ड हैं, और फिर भी परिणाम में केवल एक रिकॉर्ड चाहते हैं, तो आपके पास यह तय करने के लिए कि TableB या TableC से कई मानों के साथ क्या करना है।

इसे संभालने के लिए आप tableA से मानों पर समूहित करेंगे और TableB और TableC से मानों पर समेकित का उपयोग करेंगे। उदाहरण के लिए tableA से count फ़ील्ड्स का योग प्राप्त करना और मूल्य फ़ील्ड TableB से फ़ील्ड का औसत प्राप्त करना:

SELECT
  A.Id,
  A.Name,
  SUM(B.Count) TotalCount,
  AVG(C.Price) AveragePrice
FROM
  TableA A
  LEFT JOIN TableB B ON A.id = B.a_id
  LEFT JOIN TableC C ON A.id = C.a_ID
GROUP BY
  A.Id,
  A.Name
0
जोड़ा
@ एंड्री एम धन्यवाद। कारण मैं सिर्फ टेबलए पंक्तियों को वापस लौटना चाहता हूं, एक चयन सूची बॉक्स को पॉप्युलेट करना है। क्या आप वर्तमान आउटपुट को 'फ़िल्टरिंग' करने का साधन सुझा सकते हैं या क्या 'टेबलए से पंक्तियों' को इंगित करने के एसक्यूएल में 'मानक' तरीका है?
जोड़ा लेखक barryleajo, स्रोत
आपके कोड सुझाव के लिए धन्यवाद। हालांकि मेरा डेटा मुख्य रूप से टाइप आईडी के रूप में केवल आईडी संख्या के साथ वर्चर टाइप करता है; इसलिए कोई गणना नहीं, कोई समेकन नहीं है और मैं कुछ भी गिनना नहीं चाहता हूं।
जोड़ा लेखक barryleajo, स्रोत
@Andriy एम - सुझाए गए अनुसार मेरे मूल प्रश्न के आगे और संपादित करें और उदाहरण
जोड़ा लेखक barryleajo, स्रोत
धन्यवाद। मैं आपके वाक्यविन्यास का उपयोग करके आवश्यक सभी कॉलम वापस कर सकता हूं। मेरी समस्या यह है कि मैं बहुत सारी पंक्तियां वापस कर रहा हूं - मूल पोस्ट में महत्वपूर्ण संपादन देखें। मैं केवल टेबलए से पंक्तियां वापस करना चाहता हूं।
जोड़ा लेखक barryleajo, स्रोत
मेरे संदर्भ के लिए कर्मचारी केवल एक विभाग/फर्म से संबंधित होगा, इसलिए वे जो टेबलए में प्रत्येक रिकॉर्ड से संबंधित हैं
जोड़ा लेखक barryleajo, स्रोत
आपके संकेत के लिए धन्यवाद मुझे लगता है कि मैंने इसे पाया है! फर्मिड के साथ जोड़ा जाने पर DeptID केवल अनूठा है। उसी विभाग की कई घटनाएं थीं जो विस्तारित परिणाम सेट दे रही थीं। मैंने फर्मिड और वॉयला को भी शामिल करने के लिए प्रवेश पर INNER जॉइन बदल दिया। मुझे एहसास नहीं हुआ कि आप कई कॉलम पर शामिल हो सकते हैं। स्क्रैपी क्यू के लिए सभी के लिए apols के साथ और मैं ठोड़ी पर -1 ले जाएगा और अगली बार बेहतर करूँगा। @Andriy एम के लिए भी धन्यवाद; अब मैं आगे बढ़ सकता हूं।
जोड़ा लेखक barryleajo, स्रोत
@barryleajo: यदि आपके पास टेबलबी या टेबलसी से कई मान हैं, तो आपको यह तय करना होगा कि उनके साथ क्या करना है। ऊपर मेरा संपादन देखें।
जोड़ा लेखक Guffa, स्रोत
@barryleajo: आप कौन से फर्म नाम और विभाग के नाम दिखाना चाहते हैं?
जोड़ा लेखक Guffa, स्रोत
@barryleajo: यदि केवल एक फर्म और एक विभाग से संबंधित हैं, तो आपको tableA में होने के परिणामस्वरूप अधिक पंक्तियां नहीं मिलेंगी।
जोड़ा लेखक Guffa, स्रोत
@barryleajo: क्षमा करें, मुझे यकीन नहीं है कि मैं समझता हूं कि आप किस बारे में बात कर रहे हैं। यदि आपको "केवल टेबलए की पंक्तियों" की आवश्यकता है, तो केवल टेबलए पंक्तियों का चयन करें। यदि आपको मिलान की गई अन्य तालिकाओं से डेटा शामिल करने की आवश्यकता है, तो आपको सबसे पहले एकाधिक मैचों प्रति तालिका ए पंक्ति (जिसमें शामिल मैचों में से शामिल हैं) के मुद्दे को हल करने की आवश्यकता है, और मेरा मानना ​​है कि गुफा ने अभी एक तरीका पेश किया है उस मुद्दे को हल करने के लिए। यदि यह आपके लिए काम नहीं करता है, तो कृपया अपने प्रश्न में विस्तृत करें, उदाहरण के साथ, आप वास्तव में क्या चाहते हैं।
जोड़ा लेखक Andriy M, स्रोत
@barryleajo: ठीक है यह है जो भी आप चाहते हैं उसे करने का तरीका जैसा आपने इसे व्यक्त किया आपके प्रश्न में। यदि आपको बहुत सारी पंक्तियां मिलती हैं (यानी, जैसा कि मैं इसे समझता हूं, टेबलए के मुकाबले ज्यादा है), तो सबसे अधिक संभावना यह है कि: टैबलेट में एक पंक्ति में टैबलेट या टेबलसी में एक से अधिक मैच हैं। इससे आउटपुट में टेबलए पंक्ति को दोहराया जा सकता है, प्रत्येक मैच के लिए एक उदाहरण। यदि आप टेबलए डेटा को डुप्लीकेट नहीं करना चाहते हैं तो आपको यह तय करने की आवश्यकता है कि अन्य तालिका (या तालिकाओं ') मिलान पंक्तियों को आउटपुट में समाप्त होना चाहिए।
जोड़ा लेखक Andriy M, स्रोत

In the example SQL you have the following relationship diagram TableC => TableA <= TableB but you have following: TableA <= TableB <= TableC. So you have to write it as follows:

SELECT *
FROM Table1 t1 
    JOIN TableB t2 ON t1.Id = t2.a_Id
    JOIN TableC t3 ON t2.Id = t3.b_Id
0
जोड़ा
SET @sql = N'SELECT c.cRef, b.bRef, a.aID, a.aType, a.aRef1, a.aRef2 से (तालिका एक जॉइन टेबल बी बी पर a.aID = b.b_ID1) टेबलसी सी चालू करें बी.बी_आईडी 2 = सीटी_आईडी '
जोड़ा लेखक barryleajo, स्रोत
धन्यवाद। मेरे पास टेबलए में 4 पंक्तियां हैं, टेबलबी में 3 पंक्तियां और टेबलसी में 3 पंक्तियां हैं। मैं 7 पंक्तियों को वापस कर रहा हूं जब मैं केवल टेबलए में 4 पंक्तियां वापस करना चाहता हूं। मैं टेबल ए में पंक्तियों के विवरण प्रदान करने के लिए टेबल्स बी और सी में कॉलम का उपयोग कर रहा हूं जिसमें आईडी नंबर शामिल है।
जोड़ा लेखक barryleajo, स्रोत
धन्यवाद @xxMUROxx, मेरे टेबल रिश्ते वास्तव में टेबलए => टेबलबी => टेबलसी जो मुझे लगता है शायद वही है (?) मैं सही कॉलम लौट रहा हूं, मेरी समस्या यह है कि मैं बहुत सारी पंक्तियां वापस कर रहा हूं।
जोड़ा लेखक barryleajo, स्रोत
आपकी एसक्यूएल क्वेरी कैसी दिखती है?
जोड़ा लेखक Michael Mairegger, स्रोत
इस उदाहरण में यह वही है, लेकिन यदि आप LEFT JOIN s का उपयोग नहीं करते हैं। बहुत सारी पंक्तियों के साथ आपका क्या मतलब है?
जोड़ा लेखक Michael Mairegger, स्रोत