2011-06-17 11 views
5

डेटाबेस SQL ​​Server 2008 है। मेरे पास एक क्वेरी है जो पंक्तियों को एक या अधिक तालिकाओं से निकालती है और फिर उन्हें तालिका चर में डालने का प्रयास करती है।डुप्लिकेट टेबल सम्मिलित करना

मैं एक कुशल तरीका डुप्लिकेट आवेषण रोकना चाहते हैं, तो क्या मैं के साथ आया था:

INSERT INTO @MyTableVariable 
SELECT SomeID 
FROM SomeTable st 
INNER JOIN SomeOtherTable sot ON sot.SomeID = st.SomeID 
LEFT JOIN @MyTableVariable t ON t.SomeID = sot.SomeID 
WHERE t.SomeID IS NULL 

लेकिन यह कुछ निश्चित परिस्थितियों में डुप्लिकेट आवेषण को रोकने के लिए प्रतीत नहीं होता।

ऐसा लगता है (और यदि आप इसके बारे में सोचते हैं और क्वेरी प्लान देखते हैं तो यह समझ में आता है) कि बाएं जॉइन ऑपरेशन में @MyTableVariable का केवल प्रारंभिक "राज्य" उपयोग किया जाता है। दूसरे शब्दों में, यह डुप्लिकेट को रोक देगा यदि @MyTableVariable में पहले से ही कुछ कथन चलाया गया था, तो यह कथन चलाए जाने से पहले, लेकिन डुप्लीकेट को रोक नहीं पाएगा अगर कुछ/योग्य या कुछ अन्य पर क्लिक करने वाले व्यक्ति को डुप्लिकेट किया गया है।

बस चयन कथन पर एक DISTINCT को थप्पड़ मारने के अलावा, क्या इसे संभालने का एक और अधिक प्रभावशाली तरीका है?

+0

यदि आप 'DISTINCT' या' GROUP BY' नहीं करना चाहते हैं, तो आप अपने कॉलम पर एक अनन्य अनुक्रमणिका बना सकते हैं, और डुप्लिकेट कुंजी को अनदेखा कर सकते हैं। – Lamak

+0

डुप्लिकेट कुंजी त्रुटियों को इगोर करने के बारे में आप कैसे जाते हैं? और क्या यह वास्तव में अलग प्रदर्शन करने से तेज है? – RMD

उत्तर

3

जहाँ तक मुझे पता के रूप में नहीं कर पाएगा, वहाँ एसक्यूएल सर्वर में INSERT IGNORE या INSERT ON DUPLICATE KEY का कोई रास्ता नहीं है । मेर्ज है, लेकिन यह आपकी समस्या का समाधान नहीं करेगा, क्योंकि यह आपके INSERT के समान व्यवहार करेगा, यानी यह अपवाद उठाएगा।

क्या इसे संभालने का एक और अधिक प्रभावशाली तरीका है?

मेरे विचार में, अपने विकल्प हैं: छानने का अधिक विशिष्ट तरीका खोजना

  1. प्रयास/इतनी के रूप में डुप्लिकेट का निर्माण नहीं में शामिल होने।

  2. किसी भी पहले चरण में कहीं भी 'स्लैप' DISTINCT ताकि डुप्लीकेट को किसी भी तालिका में प्रवेश करने से पहले किसी भी स्थान में प्रवेश करने से रोका जा सके।

  3. मुख्य रूप से लागू DISTINCTs के साथ उप-चयनों में डुप्लीकेट बनाने के लिए मुख्य रूप से जिम्मेदार तालिका (तालिका) को रूपांतरित करें।

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

0

आपको तालिका चर के आईडी कॉलम पर कुंजी बनाने की आवश्यकता है।

इस तरह यह घोषणा:

declare @MyTableVariable table(SomeID int identity(1,1) primary key) 

यह प्राथमिक कुंजी डुप्लिकेट डालने

आशा इस मदद करता है

+0

मेरी तालिका चर में पहले से ही एक प्राथमिक कुंजी निर्दिष्ट है।मैं सामान्य रूप से डुप्लीकेट को रोकने के लिए नहीं कह रहा हूं, मैं पूछ रहा हूं कि एक अलग खंड को पुनर्स्थापित किए बिना मेरी क्वेरी के प्रदर्शन को अनुकूलित करने के लिए कैसे एक संपूर्ण प्रकार के ऑपरेशन का कारण बनता है। – RMD

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