2014-05-21 8 views
15

मान लें कि मेरे पास तीन टेबल ए, बी, और सी हैं। प्रत्येक में दो कॉलम हैं: एक प्राथमिक कुंजी और डेटा का कुछ अन्य टुकड़ा। उनमें से प्रत्येक पंक्तियों की एक ही संख्या है। यदि प्राथमिक कुंजी पर JOIN ए और बी, मुझे पंक्तियों की एक ही संख्या के साथ समाप्त होना चाहिए जैसा कि उनमें से किसी एक में है (जैसा कि एरो * बीरो के विपरीत है)।एकाधिक-टेबल डुप्लिकेट पंक्तियों का उत्पादन क्यों करती है?

अब, अगर A JOIN BC के साथ, मैं डुप्लिकेट पंक्तियों के साथ क्यों समाप्त करूं? मैंने कई बार इस समस्या में भाग लिया है और मुझे समझ में नहीं आता है। ऐसा लगता है कि इसे JOIN आईएन A और B के समान परिणाम उत्पन्न करना चाहिए क्योंकि इसकी पंक्तियों की संख्या समान है, लेकिन इसके बजाय, डुप्लिकेट का उत्पादन होता है।

प्रश्नों है कि इस तरह के परिणाम स्वरूप

SELECT * 
FROM M 
    INNER JOIN S 
     on M.mIndex = S.mIndex 
    INNER JOIN D 
     ON M.platformId LIKE '%' + D.version + '%' 
    INNER JOIN H 
     ON D.Name = H.Name 
     AND D.revision = H.revision 

यहाँ तालिकाओं के लिए स्कीमा हैं के हैं। एच शामिल एक ऐतिहासिक तालिका सब कुछ है कि डी में कभी था प्रत्येक विकास तथा प्रत्येक एम

टेबल एम

[mIndex] [int] NOT NULL PRIMARY KEY, 
    [platformId] [nvarchar](256) NULL, 
    [ip] [nvarchar](64) NULL, 
    [complete] [bit] NOT NULL, 
    [date] [datetime] NOT NULL, 
    [DeployId] [int] NOT NULL PRIMARY KEY REFERENCES D.DeployId, 
    [source] [nvarchar](64) NOT NULL PRIMARY KEY 

टेबल एस

[order] [int] NOT NULL PRIMARY KEY, 
[name] [nvarchar](64) NOT NULL, 
[parameters] [nvarchar](256) NOT NULL, 
[Finished] [bit] NOT NULL, 
[mIndex] [int] NOT NULL PRIMARY KEY, 
[mDeployId] [int] NOT NULL PRIMARY KEY, 
[Date] [datetime] NULL, 
[status] [nvarchar](10) NULL, 
[output] [nvarchar](max) NULL, 
[config] [nvarchar](64) NOT NULL PRIMARY KEY 
के लिए एक एस के लिए कई एम पंक्तियों रहे हैं युक्त है

टेबल डी

[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
[branch] [nvarchar](64) NOT NULL, 
[revision] [int] NOT NULL, 
[version] [nvarchar](64) NOT NULL, 
[path] [nvarchar](256) NOT NULL 

टेबल एच

[IdDeploy] [int] IDENTITY(1,1) NOT NULL, 
[name] [nvarchar](64) NOT NULL, 
[version] [nvarchar](64) NOT NULL, 
[path] [nvarchar](max) NOT NULL, 
[StartDate] [datetime] NOT NULL, 
[EndDate] [datetime] NULL, 
[Revision] [nvarchar](64) NULL, 

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

+2

आप जो पूर्ण क्वेरी चल रहे हैं वह क्या है? – mikeyq6

+0

यह आपके द्वारा उपयोग किए जा रहे जोड़ों के प्रकार पर बहुत निर्भर करता है। –

+0

आप कार्टेशियन जुड़ सकते हैं। विकी पेज में इसके उदाहरण और अन्य प्रकार के शामिल हैं - http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join –

उत्तर

7

टेबल M, S में से एक, D, या H के लिए एक से अधिक पंक्ति है, तो एक दिया Id (यदि सिर्फ Id स्तंभ प्राथमिक कुंजी नहीं है), तो क्वेरी "नकल" पंक्तियों में परिणाम होगा। यदि आपके पास तालिका में Id के लिए एक से अधिक पंक्तियां हैं, तो अन्य कॉलम, जो विशिष्ट रूप से पंक्ति की पहचान करेंगे, को भी जॉइन स्थिति में शामिल किया जाना चाहिए।

संदर्भ:

Related Question on MSDN Forum

0

इस उदाहरण आप डुप्लिकेट हो रही है क्योंकि आप एम पर दोनों डी और एस शामिल हो रहे हैं मैं तुम्हें नीचे की तरह S.id पर D.id में शामिल होने जाना चाहिए मान में ठीक है:

SELECT * 
FROM M 
INNER JOIN S 
    on M.Id = S.Id 
INNER JOIN D 
    ON S.Id = D.Id 
INNER JOIN H 
    ON D.Id = H.Id 
15

जब आपके पास संबंधित तालिकाओं में अक्सर आपके पास एक-से-कई या कई से अधिक संबंध होते हैं। तो जब आप टेबलबी में टेबल रिकॉर्ड में शामिल होते हैं तो टेबलब में कई रिकॉर्ड होते हैं। यह सामान्य और उम्मीद है।

कभी-कभी आपको केवल कुछ कॉलम की आवश्यकता होती है और वे सभी रिकॉर्ड्स के लिए समान होते हैं, तो आपको डुप्लिकेट को हटाने के लिए किसी प्रकार का समूह या अलग करना होगा। एक उदाहरण पर नजर डालते हैं:

TableA 
Id Field1 
1 test 
2 another test 

TableB 
ID Field2 field3 
1 Test1 something 
1 test1 More something 
2 Test2 Anything 

तो जब आप उन्हें शामिल होने और सभी फ़ाइलों का चयन आपको मिलेगा:

select * 
from tableA a 
join tableb b on a.id = b.id 

a.Id a.Field1  b.id b.field2 b.field3 
1 test   1  Test1  something 
1 test   1  Test1  More something 
2 another test 2 2  Test2  Anything 

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

select a.Id, a.Field1, b.field2 
from tableA a 
join tableb b on a.id = b.id 

a.Id a.Field1  b.field2 
1 test   Test1  
1 test   Test1 
2 another test Test2 

यह डुप्लिकेट प्रतीत होता है लेकिन यह तालिकाबी में एकाधिक रिकॉर्ड की वजह से नहीं है।

आप सामान्य रूप से अलग-अलग उपयोग करके या डुप्लिकेट को हटाने के लिए कहां फ़िल्टर करके फ़िल्टर करके इसे समूह और समूह का उपयोग करके ठीक करते हैं। आप इसे कैसे हल करते हैं इस पर निर्भर करता है कि आपका व्यवसाय नियम क्या है और आपका डेटाबेस कैसे डिज़ाइन किया गया है और वहां किस प्रकार का डेटा है।

0

यह एक सच में बुनियादी "ओह" जवाब की तरह ध्वनि सकता है, लेकिन लगता है कि स्तंभ आप विलय फ़ाइल पर से देखने के लिए उपयोग कर रहे हैं वास्तव में से भरा है बनाने अद्वितीय मूल्य!

मैंने आज पहले देखा था कि PowerQuery आपको एक त्रुटि नहीं देगा (जैसे PowerPivot) और खुशी से आपको कई-कई विलय चलाने की अनुमति मिल जाएगी। इसके परिणामस्वरूप प्रत्येक रिकॉर्ड के लिए कई पंक्तियां बनाई जा रही हैं जो गैर-अद्वितीय मूल्य से मेल खाते हैं।

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