让那些只生产一种产品类型和多种型号的制造商。
错误答案:
`SELECT` `DISTINCT` maker
from Product `GROUP BY` maker
`HAVING` (`COUNT`(`DISTINCT` TYPE) = 1 `AND` `COUNT`(`DISTINCT` model) > 1)
正确答案:
`SELECT` `DISTINCT` maker, type
`from` Product
`WHERE` maker in (SELECT DISTINCT maker from Product
`GROUP BY` maker `HAVING` `COUNT`(`DISTINCT` TYPE) = 1 `AND` `COUNT`( model) > 1)
简短的数据库描述“计算机公司”:
数据库方案由四个表组成: 产品(制造商,型号,型号) PC(代码,型号,速度,内存,高清,CD,价格) 笔记本电脑(代码,型号,速度,内存,高清,屏幕,价格) 打印机(代码,型号,颜色,类型,价格) 产品表包含有关制造商,型号和产品类型(“PC”,“笔记本电脑”或“打印机”)的数据。假设Product表中的型号对于所有制造商和产品类型都是唯一的。 PC表中的每台个人计算机都由唯一代码明确标识,并且其特征还在于其型号(外键指产品表),处理器速度(以MHz为单位) - 速度字段,RAM容量(以Mb为单位) - ram ,硬盘驱动器容量(以Gb为单位) - 高清,CD-ROM速度(例如'4x') - cd及其价格。笔记本电脑表类似于PC表,除了它代替CD-ROM速度,它包含屏幕尺寸(以英寸为单位) - 屏幕。对于Printer表中的每个打印机型号,其输出类型('y'表示颜色,'n'表示单色) - 色域,打印技术('Laser','Jet'或'Matrix') - 类型和价格已指定。
答案 0 :(得分:2)
(1)注意你标记为"右边"答案与给出的问题陈述相矛盾。给出的问题陈述表示"让制造商"而不是"得到制造商和类型"。 "错误"因此,答案不应被视为"错误",因为它完全符合问题陈述的要求。
(2)但是,假设您在呈现实际问题陈述方面并不准确,而实际问题确实是"让只有一种类型的制造商,以及它的类型#34 ;确实有必要以第二种方式编写查询。
原因是GROUP BY子句在内部创建了一个"中间表",而SELECT子句实际上引用了这个"中间表"而不是FROM子句中指定的表,并且此中间表中包含的唯一列是GROUP BY子句中提到的那些(在您的情况下,TYPE不是,因为显而易见的原因,您必须计算每个制造商的不同类型的数量)。
所以你必须首先得到一组有关的制造商,然后再将其连接起来"到原来的表。前者是子查询的作用,后者是" WHERE ... IN ..."确实