2012-07-08 30 views
7

मेरे तालिका:चेक स्तंभ

id attribute 
1 2 
1 2 
2 3 
2 4 
5 1 
5 1 
6 3 
6 3 
6 5 

अब मैं केवल उत्पादन करना चाहते हैं उन idattribute साथ, विशेषता प्रत्येक id के लिए एक ही है अगर।

इस नमूने तालिका में, उत्पादन होगा

id attribute 
1 2 
5 1 

उत्तर

7

आप इस दृष्टिकोण का उपयोग कर सकते हैं:

SELECT DISTINCT id, attribute 
FROM test t1 
WHERE (SELECT count(DISTINCT attribute) 
     FROM test t2 
     WHERE t2.id = t1.id) = 1 

एक बेहतर दृष्टिकोण हो सकता है:

SELECT 
    DISTINCT t1.id, t1.attribute 
FROM 
    test t1, 
    (
     SELECT 
     id, 
     count(DISTINCT attribute) COUNT 
     FROM 
     test 
     GROUP BY 
     id 
     HAVING 
     COUNT = 1 
    ) t2 
WHERE 
    t1.id = t2.id 
+1

इस विधि पर एक सूचकांक के साथ काफी कुशल होने का अंतिम संस्करण उम्मीद होती है, बहुत अक्षम है, क्योंकि यह हर पंक्ति के लिए कि भीतर जिज्ञासा चलाएगा परीक्षण में टेबल बढ़ने के साथ ही यह प्रदर्शन को बहुत तेज़ी से प्रभावित करना शुरू कर देगा। – Braiba

+0

@ ब्राइबा: आप सही हैं। दूसरा दृष्टिकोण जटिलता को कम कर सकता है। –

+0

आंतरिक क्वेरी कार्यशील रूप से यपरक्यूब के पहले जैसा ही है; मैं नहीं देखता कि बाहरी क्वेरी यहां क्या जोड़ती है, या क्या मुझे कुछ याद आ रहा है? – Braiba

1

ठीक है, मैं डी इसके बजाय निम्न दृष्टिकोण का उपयोग करें:

 SELECT DISTINCT ta.id, ta.attribute 
     FROM test ta 
    LEFT JOIN test tb 
     ON ta.id = tb.id AND ta.attribute <> tb.attribute 
     WHERE tb.id IS NULL; 

... जैसा कि मैं आमतौर पर कम से कम घोंसला वाले प्रश्नों को प्रतिस्थापित तालिकाओं के साथ बदलने की कोशिश करता हूं। बेशक, यदि आपकी मेज छोटी है, तो इससे कोई फर्क नहीं पड़ता।

+0

नेस्टेड प्रश्न तब तक ठीक होते हैं जब आप उन पर शामिल होते हैं, बजाय उन्हें एक चयन/कहां/ऑन क्लॉज में डालने के बजाय। इस तरह एक टेबल में शामिल होना हालांकि बेहतर नहीं है; तालिका बढ़ने के साथ प्रसंस्करण समय अभी भी तेजी से बढ़ जाएगा। ऐसा करने के सबसे प्रभावी तरीके के लिए – Braiba

8
SELECT id, MIN(attribute) AS attribute 
FROM test 
GROUP BY id 
HAVING COUNT(DISTINCT attribute) = 1 ; 

या:

SELECT id, MIN(attribute) AS attribute 
FROM test 
GROUP BY id 
HAVING MIN(attribute) = MAX(attribute) ; 

मैं (id, attribute)

+0

+1। MIN = MAX चीज वास्तव में चालाक है; मैं भविष्य के लिए उस चाल को याद रखूंगा। – Braiba

+0

मुझे वास्तव में यह जवाब भी पसंद है। एसओ पर शिष्टाचार क्या है? सबसे पहले सेवा या सबसे अच्छा जवाब आओ? –

+0

@Terry Uhlang सर्वश्रेष्ठ उत्तर मुझे सबसे ज्यादा समझ में आता है क्योंकि यह एक ही समस्या वाला पहला अन्य उपयोगकर्ता होगा जब वे इस प्रश्न की खोज करेंगे। – Braiba

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