WHERE IN() 子句中的 Select 语句

米捷

鉴于这些表:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章