Oracle SQL查询需求:筛选打印机产量多于PC/笔记本的厂商
筛选打印机产量多于PC或笔记本的厂商
要实现这个需求,我们需要先统计每个厂商生产的打印机、PC、笔记本的实际产品数量(以各表中唯一的serial_number计数),再对比数量筛选符合条件的厂商。以下是两种适合Oracle LiveSQL的实现方式:
方法一:分步统计(逻辑清晰)
WITH PrinterCounts AS ( -- 统计每个厂商的打印机总产量 SELECT p.maker, COUNT(pr.serial_number) AS printer_total FROM Product p JOIN Printer pr ON p.model = pr.model WHERE p.type = 'printer' GROUP BY p.maker ), PCCounts AS ( -- 统计每个厂商的PC总产量 SELECT p.maker, COUNT(pc.serial_number) AS pc_total FROM Product p JOIN PC pc ON p.model = pc.model WHERE p.type = 'pc' GROUP BY p.maker ), LaptopCounts AS ( -- 统计每个厂商的笔记本总产量 SELECT p.maker, COUNT(l.serial_number) AS laptop_total FROM Product p JOIN Laptop l ON p.model = l.model WHERE p.type = 'laptop' GROUP BY p.maker ) SELECT pc.maker FROM PrinterCounts pc LEFT JOIN PCCounts p ON pc.maker = p.maker LEFT JOIN LaptopCounts l ON pc.maker = l.maker WHERE pc.printer_total > NVL(p.pc_total, 0) OR pc.printer_total > NVL(l.laptop_total, 0);
方法二:单表关联+条件聚合(更简洁)
SELECT p.maker FROM Product p LEFT JOIN Printer pr ON p.model = pr.model LEFT JOIN PC pc ON p.model = pc.model LEFT JOIN Laptop l ON p.model = l.model GROUP BY p.maker HAVING COUNT(pr.serial_number) > NVL(COUNT(pc.serial_number), 0) OR COUNT(pr.serial_number) > NVL(COUNT(l.serial_number), 0);
关键说明
- 产量计数:使用
COUNT(serial_number)是因为每个serial_number是对应表的主键,唯一标识一个实际产品,能准确统计总产量。 - NVL函数:处理厂商不生产某类产品的情况(此时对应计数为NULL),将NULL转为0,确保比较逻辑有效(Oracle中NULL与任何值比较结果为UNKNOWN,会被过滤)。
- 筛选逻辑:
OR表示只要打印机数量多于PC或者多于笔记本,就符合条件。如果需要同时多于两者,把OR改成AND即可。
内容的提问来源于stack exchange,提问作者KaedeZeelich
相关产品推荐
相关产品推荐

