鉴于这些表:
Product(maker, model)
Desktop(model)
Laptop(model)
我想知道制造笔记本电脑和台式机的制造商。
如果我想知道制造商是否生产两种特定型号,我会这样做:
SELECT p.maker FROM Product p
WHERE p.model IN ('model1', 'model2')
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model) = 2;
在这种情况下,我不需要特定型号,但我需要知道一个型号必须是笔记本电脑,另一个必须是台式机。
我应该像这样在 IN 子句中使用 select 语句吗?
SELECT p.maker FROM Product p
WHERE p.model IN ((SELECT d.model FROM Desktop d WHERE d.model=p.model),
(SELECT l.model FROM Laptop d WHERE l.model=p.model))
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model) = 2;
或者还有其他更好的方法来做到这一点?
编辑:正如 HoneyBadger 所建议的那样,使用 EXISTS 是一种更好的方法:
SELECT p.maker FROM Product p
WHERE EXISTS(SELECT d.model FROM Desktop d WHERE d.model=p.model)
AND EXISTS(SELECT l.model FROM Laptop d WHERE l.model=p.model)
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model)>1;
SELECT p.maker FROM Product p
WHERE p.model IN (
(SELECT d.model FROM Desktop d WHERE d.model=p.model
UNION
SELECT l.model FROM Laptop d WHERE l.model=p.model
)
)
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model) = 2;
我还希望将它们重构到同一个表中,并使用一个可以指定台式机与笔记本电脑的类型字段。我知道笔记本电脑可能有一些不同的属性(屏幕、摄像头/麦克风、蓝牙等)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句