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