2013-02-01 33 views
6

मुझे यह करना है:मैं उन निर्माताओं को कैसे ढूंढूं जो एक प्रकार का बेचते हैं लेकिन दूसरे नहीं?

उन निर्माताओं को ढूंढें जो पीसी बेचते हैं लेकिन लैपटॉप नहीं।

output

परिणाम इस क्वेरी से सेट:

SELECT maker, type FROM product 

इस और सही उत्पादन से

SELECT maker, type FROM product 
WHERE type = 'PC' AND type <> 'Laptop' 

आउटपुट:

इस क्वेरी सही परिणाम outputting नहीं है ex2

तालिका स्कीमा:

table

यहां तक ​​कि इस एक काम नहीं कर रहा:

SELECT maker, type FROM product 
WHERE type IN('PC') AND type NOT IN('Laptop') 

नोट - type सिर्फ स्पष्टीकरण

के लिए जोड़ा जाता है

उत्तर

7

प्रयास करें:

SELECT maker 
FROM product 
GROUP BY maker 
HAVING SUM(CASE WHEN type = 'PC' THEN 1 ELSE 0 END) > 0 
    AND SUM(CASE WHEN type = 'Laptop' THEN 1 ELSE 0 END) = 0 
+0

क्यों गिनती नहीं है एक आसान तरीका है? ओपी का कहना है कि उन निर्माताओं को ढूंढें जो पीसी बेचते हैं लेकिन लैपटॉप नहीं। 'इसका मतलब है' उन निर्माताओं को ढूंढें जो केवल पीसी बेचते हैं –

+0

@ डिकलिंग यह रिक्त – swapnesh

+0

रिक्त हो रहा है, व्हाउप्स, 'एसयूएम' (निश्चित) होना चाहिए था। – Dukeling

0

मैं कर सकते हैं सुझाव है कि आप करने की कोशिश अपने खंड में मूल्यों को ट्रिम करें ... कुछ गलती हो सकती है और इसलिए पूर्व कार्य मैच वांछित परिणाम वापस नहीं कर रहे हैं।

तो जैसा:

SELECT maker , type FROM product 
WHERE TRIM(type) = 'PC' AND TRIM(type) <> 'Laptop' 

वैकल्पिक रूप से, आप बस की कोशिश कर सकते:

SELECT maker , type FROM product 
WHERE TRIM(type) = 'PC' 

लैपटॉप और पीसी 2 अलग प्रकार के होते हैं, तो सिर्फ पीसी के लिए फ़िल्टर करें।

+0

प्रयास करें इस मामले – swapnesh

4

प्रयास करें इस निर्माताओं है कि बिक्री पीसी नहीं बल्कि लैपटॉप जानकारी प्राप्त करें।

SELECT maker , type FROM product 
WHERE type = 'PC' AND maker NOT IN 
(SELECT maker FROM product WHERE type = 'laptop') 
+1

इसके कामकाज के लिए, लेकिन स्पष्ट परिणामों के लिए DISTINCT का उपयोग करना है, क्योंकि यह इसके साथ डुप्लिकेट परिणाम बना रहा है .. आपके प्रयासों के लिए +1 – swapnesh

1
select distinct maker 
from product 
where type = 'PC' 
    and maker not in (select maker from product where type = 'Laptop') 

यह काम करता है

1
SELECT DISTINCT maker 
FROM Product AS pc_product 
WHERE type = 'pc' AND 
     NOT EXISTS (SELECT maker 
        FROM Product 
        WHERE type = 'laptop' AND 
         maker = pc_product.maker 
       ); 
-2
select maker from Product where type in('PC') 
intersect 
select maker from Product where type in ('PC','Printer') 
except 
select maker from Product where type='Laptop' 
0

नीचे के रूप में की कोशिश करो;

Select maker from product where type in('PC','laptop') 
    except 
    select maker from product where type='laptop' 
0

उत्पाद से अलग निर्माता का चयन करें जहां type = 'पीसी' और में नहीं निर्माता (उत्पाद से निर्माता का चयन करें जहां type = 'लैपटॉप')

3

वहाँ इस समस्या को हल करने के लिए कई विदेशी तरीके हैं। यहां, पहले दिमाग में आने वाला :)

  1. मामूली समाधान।

    SELECT DISTINCT maker 
        FROM Product 
        WHERE type = 'PC' AND maker NOT IN (
         SELECT maker 
         FROM Product 
         WHERE type = 'Laptop') 
    
  2. EXCEPT का उपयोग करना JOIN

    SELECT DISTINCT Pr.maker 
    FROM Product AS Pr LEFT JOIN Product AS Pr2 
        ON Pr.maker = Pr2.maker AND Pr2.type = 'Laptop' 
    WHERE Pr.type = 'PC' AND Pr2.maker IS NULL 
    
  3. का उपयोग करना।

    SELECT DISTINCT maker 
        FROM product AS Pr1 
        WHERE type = 'PC' 
    EXCEPT 
    SELECT DISTINCT Pr2.maker 
        FROM product AS Pr2 
        WHERE type = 'laptop' 
    
  4. DISTINCT और NOT EXISTS का उपयोग करना।

    SELECT DISTINCT maker 
    FROM Product AS PcP 
    WHERE type = 'PC' AND 
         NOT EXISTS (SELECT maker 
            FROM Product 
            WHERE type = 'laptop' AND 
            maker = PcP.maker 
           ) 
    
  5. CASE वेतन वृद्धि और HAVING का उपयोग करना।

    SELECT maker 
        FROM product 
    GROUP BY maker 
    HAVING SUM(CASE WHEN type = 'PC' THEN 1 ELSE 0 END) > 0 
        AND SUM(CASE WHEN type = 'Laptop' THEN 1 ELSE 0 END) = 0 
    
  6. DISTINCT और तुलना सबक्वेरी

    SELECT DISTINCT maker 
    FROM Product AS Pr 
    WHERE (SELECT COUNT(1) 
         FROM Product AS Pt 
         WHERE Pt.type = 'PC' AND Pt.maker = Pr.maker 
        ) > 0 
        AND 
         (SELECT COUNT(1) 
         FROM Product AS Pt2 
         WHERE Pt2.type = 'Laptop' AND 
         Pt2.maker = Pr.maker 
        ) = 0 
    
  7. का उपयोग HAVING का उपयोग करना और धोखा (HAVING कुल बिना कॉलम शामिल नहीं हो सकता है, तो हम बेहोश (इस मामले में उपयोग करें) कुल MIN (या MAX - इससे कोई फर्क नहीं पड़ता)

    SELECT maker 
        FROM (SELECT DISTINCT maker, type 
          FROM Product 
          WHERE type IN ('PC', 'Laptop') 
         ) AS T 
    GROUP BY maker 
    HAVING COUNT(*) = 1 AND MIN(type) = 'PC' 
    
0

समस्या

Select maker from product 
where type = 'PC' 
Except 
Select maker from product 
where type = 'laptop' 
0
select distinct Prd.maker as Maker 
from product as Prd INNER JOIN PC as P 
ON  Prd.model = P.model 
WHERE NOT EXISTS 
(
    SELECT 1 FROM Laptop as L INNER JOIN Product as P 
    ON L.model = P.model and Prd.maker = P.maker 
) 
0

हल करने के लिए इस क्वेरी

SELECT DISTINCT MAKER FROM PRODUCT 
WHERE TYPE IN ('PC') AND MAKER NOT IN 
(SELECT MAKER FROM PRODUCT WHERE TYPE IN ('LAPTOP'))