2011-09-29 13 views
39

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

मैं एक प्रश्न, कोड के नीचे मिल गया है, और मैं यह शायद काम करता है लगता है, लेकिन यह बहुत धीमी है:

SELECT `pm`.`id` 
FROM `R2R`.`partmaster` `pm` 
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd` 
    WHERE `pm`.`id` = `pd`.`part_num` 
) 

तो क्वेरी इस प्रकार करने के लिए कोशिश कर रहा है:

सभी का चयन करें R2R.partmaster डेटाबेस से आईडी जो wpsapi4.product_details डेटाबेस में नहीं हैं। जिन स्तंभों से मैं मेल खा रहा हूं वे partmaster.id & product_details.part_num

+0

मेरे लिए मौजूद है/अस्तित्व में नहीं है क्योंकि स्पष्ट रूप से स्पष्ट रूप से आप चाहते हैं कि स्पष्ट रूप से आप चाहते हैं। लेकिन लगता है कि सबसे धीमा तरीका है (MySQL पर)। इसे जांचें: http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-oin-is-null-mysql/ – DavidEG

उत्तर

64

पर विस्तार जोएर्ड विरोधी में शामिल होने, आप भी SELECT WHERE X NOT IN (SELECT) पैटर्न समझने में आसान उपयोग कर सकते हैं।

SELECT pm.id FROM r2r.partmaster pm 
WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd) 

नोट है कि आप केवल, रिक्त स्थान और, इस तरह के नहीं के साथ सामान्य स्तंभ नाम के साथ आरक्षित नाम शब्दों पर ` बैकटिक उपयोग करने के लिए की जरूरत है।

MySQL 5+ पर इस प्रकार की क्वेरी बहुत तेज चलती है।
MySQL 3/4 पर यह धीमा है।

सुनिश्चित करें कि आप सवाल
में खेतों आप pd.part_numpm.id पर एक सूचकांक की आवश्यकता पर अनुक्रमित है।

+1

आपके उत्तर के लिए धन्यवाद, यह जल्दी से काम नहीं करता है लेकिन क्वेरी अच्छी है, बस मेरे डीबी पर नहीं। मैंने एक और सोल्यूशन तैयार किया है लेकिन स्टैक ओवरफ्लो मुझे 3 घंटे तक पोस्ट नहीं करने देगा। – Drahcir

+1

बस एक सिर ऊपर की तरह एक समान क्वेरी MySQL 5.1.73a पर ~ 10 मिनट ले लिया। जब मैंने MySQL 5.6.22 में अपग्रेड किया तो इसमें लगभग 456ms लगे। –

+0

यह मेरे लिए काम करता है, अच्छी बात यह है कि मैं इसे बहुत अतीत, इतना सरल समझ सकता हूं। –

44

आप दो तालिकाओं में शामिल हो सकते हैं। यदि दूसरी तालिका में कोई संबंधित पंक्ति नहीं है, तो मान शून्य होंगे।

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL 
+4

यह वास्तव में स्वीकार्य उत्तर होना चाहिए। मुझे इस मामले में उप-चयन का बिंदु नहीं दिखाई देता है:/ –

+2

नए लोगों को समझने के लिए उप-चयन आसान है। – Johan

3

तो वेब पर बहुत सारी पोस्ट हैं जो दिखाती हैं कि यह कैसे करें, मुझे 3 तरीके मिले हैं, जैसा कि जोहान & सॉजेर्ड द्वारा इंगित किया गया है। मुझे इनमें से कोई भी प्रश्न काम करने में नहीं मिला, जाहिर है कि वे ठीक काम करते हैं यह मेरा डेटाबेस है जो सही तरीके से काम नहीं कर रहा है और उन सभी प्रश्नों में धीमा चल रहा है।

इसके बारे में बुनियादी jist अस्थायी तालिका बना सकते हैं और सभी जानकारी के साथ इसे भरने, तो सभी पंक्तियां अन्य में हैं दूर करने के लिए है:

तो मैं एक और तरीका है किसी और उपयोगी लग सकता है कि बाहर काम किया तालिका।

तो मैंने इन 3 प्रश्नों को किया, और यह जल्दी से दौड़ गया (कुछ क्षणों में)।

CREATE TEMPORARY TABLE 

`database1`.`newRows` 

SELECT 

`t1`.`id` AS `columnID` 

FROM 

`database2`.`table` AS `t1` 

CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`) 

DELETE FROM `database1`.`newRows` 

WHERE 

EXISTS(
    SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID` 
) 
+0

यह तेजी से चलता है क्योंकि यह केवल पहले उत्पाद की तुलना कर रहा है, या मैं यह सही नहीं देख रहा हूं ?! – MPaulo

2

जोहन के जवाब पर विस्तार करने के लिए, अगर सब-चयन में part_num स्तंभ अशक्त मान हो सकते हैं फिर क्वेरी टूट जाएगा।

इसे ठीक करने के लिए, एक अशक्त जांच

SELECT pm.id FROM r2r.partmaster pm 
WHERE pm.id NOT IN 
     (SELECT pd.part_num FROM wpsapi4.product_details pd 
        and pd.part_num is not null) 
  • क्षमा करें जोड़ें ... लेकिन जैसा कि मैंने प्रतिनिधि की जरूरत नहीं है मैं एक टिप्पणी नहीं जोड़ सकता है!
+1

'यकीन में नहीं' बुरा हो सकता है – Drew

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