我如何找到销售一种类型而不是另一种类型的制造商?

swa*_*esh 6 mysql sql database

我必须:

找到销售PC而不是笔记本电脑的制造商.

此查询未输出正确的结果:

SELECT maker, type FROM product
WHERE type = 'PC' AND type <> 'Laptop'
Run Code Online (Sandbox Code Playgroud)

从此输出和正确的输出:

产量

此查询的结果集:

SELECT maker, type FROM product
Run Code Online (Sandbox Code Playgroud)

EX2

表模式:

表

即便是这个也行不通:

SELECT maker, type FROM product
WHERE type IN('PC') AND type NOT IN('Laptop')
Run Code Online (Sandbox Code Playgroud)

注 - type仅为澄清而添加

Den*_*sov 8

有许多奇特的方法可以解决这个问题。在这里,第一个想到的:)

  1. 简单的解决方案。

    SELECT DISTINCT maker
       FROM Product
         WHERE type = 'PC' AND maker NOT IN (
             SELECT maker
             FROM Product
             WHERE type = 'Laptop')
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用EXCEPT

    SELECT DISTINCT maker
        FROM product AS Pr1
        WHERE type = 'PC'
    EXCEPT
    SELECT DISTINCT Pr2.maker
        FROM product AS Pr2
        WHERE type = 'laptop'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用DISTINCTNOT 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
                     )
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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'
    
    Run Code Online (Sandbox Code Playgroud)


Duk*_*ing 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
Run Code Online (Sandbox Code Playgroud)