swa*_*esh 6 mysql sql database
我必须:
找到销售PC而不是笔记本电脑的制造商.
此查询未输出正确的结果:
SELECT maker, type FROM product
WHERE type = 'PC' AND type <> 'Laptop'
从此输出和正确的输出:

此查询的结果集:
SELECT maker, type FROM product

表模式:

即便是这个也行不通:
SELECT maker, type FROM product
WHERE type IN('PC') AND type NOT IN('Laptop')
注 - type仅为澄清而添加
有许多奇特的方法可以解决这个问题。在这里,第一个想到的:)
简单的解决方案。
SELECT DISTINCT maker
   FROM Product
     WHERE type = 'PC' AND maker NOT IN (
         SELECT maker
         FROM Product
         WHERE type = 'Laptop')
使用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
使用EXCEPT。
SELECT DISTINCT maker
    FROM product AS Pr1
    WHERE type = 'PC'
EXCEPT
SELECT DISTINCT Pr2.maker
    FROM product AS Pr2
    WHERE type = 'laptop'
使用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
                 )
使用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
使用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
使用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'
尝试:
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