2013-02-01 12 views
6

Muszę:Jak znaleźć twórców, którzy sprzedają jeden typ, ale nie innego?

Znajdź twórców, którzy sprzedają komputery osobiste, ale nie laptopy.

To zapytanie nie jest wyprowadzanie poprawny wynik:

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

Wyjście z tego i prawidłowego wyjścia:

output

zestaw wyników z tego zapytania:

SELECT maker, type FROM product 

ex2

Tabela schematu:

table

Nawet ten jeden nie działa:

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

UWAGA - type dodaje tylko dla wyjaśnienia

Odpowiedz

7

Spróbuj:

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

Dlaczego liczyć? OP mówi: "Dowiedz się twórcy, którzy sprzedają komputery, ale nie laptopy. 'To oznacza' Znajdź twórców, którzy sprzedają tylko komputery '' –

+0

@Dukeling To zwraca pustą odpowiedź – swapnesh

+0

Whoops, powinno być 'SUMA' (naprawione). – Dukeling

0

mogę zasugerować, aby spróbować trymuj wartości w twojej klauzuli where ... mogą istnieć pewne przestrzenie na zlecenia, a więc np Dopasowania aktów nie zwracają pożądanego wyniku.

tak:

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

Alternatywnie, można po prostu spróbować:

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

Jeśli laptopa i PC są 2 oddzielne typy, a potem po prostu filtrować na PC.

+0

to nie jest przypadek – swapnesh

4

Spróbuj Sprawdzaj twórców, że komputery sprzedaży, ale nie laptopów.

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

działa, ale trzeba użyć DISTINCT dla wyraźnych wyników, ponieważ tworzy duplikat wyniku z tym .. +1 za twoje wysiłki – swapnesh

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

działa

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

Spróbuj jak poniżej;

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

zaznaczyć wyraźną ekspres z produktami gdzie type = „PC” i ekspres nie w (wybierz ekspres z produktami gdzie type = „laptop”)

3

Istnieje wiele egzotycznych sposobów na rozwiązanie tego problemu. Tutaj pierwszy przychodzi na myśl :)

  1. To banalne rozwiązanie.

    SELECT DISTINCT maker 
        FROM Product 
        WHERE type = 'PC' AND maker NOT IN (
         SELECT maker 
         FROM Product 
         WHERE type = 'Laptop') 
    
  2. Używanie 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. Używanie EXCEPT.

    SELECT DISTINCT maker 
        FROM product AS Pr1 
        WHERE type = 'PC' 
    EXCEPT 
    SELECT DISTINCT Pr2.maker 
        FROM product AS Pr2 
        WHERE type = 'laptop' 
    
  4. Używanie DISTINCT i 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. Stosując CASE przyrost i 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. Używanie DISTINCT i porównania podzapytania

    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. Korzystanie HAVING i oszustwo (The HAVING nie może zawierać kolumny bez kruszywa, więc używamy bezsensowne (w tym przypadku) łączna MIN (lub MAX - to nie ma znaczenia)

    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

Łatwym sposobem rozwiązania problemu

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

Spróbuj zapytanie

SELECT DISTINCT MAKER FROM PRODUCT 
WHERE TYPE IN ('PC') AND MAKER NOT IN 
(SELECT MAKER FROM PRODUCT WHERE TYPE IN ('LAPTOP')) 
Powiązane problemy