这是架构:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
产品表包含有关制造商,型号和产品类型的数据(' PC','笔记本电脑'打印机')。假设Product表中的型号对于所有制造商和产品类型都是唯一的。 PC表中的每台个人计算机都由唯一代码明确标识,并且其特征还在于其型号(外键指产品表),处理器速度(以MHz为单位) - 速度字段,RAM容量(以Mb为单位) - ram ,硬盘驱动器容量(以Gb为单位) - 高清,CD-ROM速度(例如,' 4x') - cd及其价格。
现在,要求发现打印机制造商还生产具有最低RAM容量和最高RAM容量的所有PC的最高处理器速度的PC。
我写了这个查询:
WITH outp AS
(
SELECT
P.Maker, MAX(PC.Speed) AS Speed
FROM
PC
JOIN
Product P ON P.model = PC.Model
WHERE
P.maker IN (SELECT maker FROM Product WHERE type = 'Printer')
AND PC.Ram = (SELECT MIN(ram) FROM PC)
GROUP BY
Maker
)
SELECT maker
FROM outp
WHERE speed = (SELECT MAX(speed) FROM outp)
这是有效的,但我想优化这个查询或找到另一个比这个更小的查询。有什么帮助吗?
谢谢你们......
答案 0 :(得分:0)
使用分析可能会更快:
SELECT * FROM
(
SELECT
P.Maker,
pc.speed,
MAX(PC.Speed) over() AS maxSpeed
FROM
(SELECT pc.speed, pc.ram, p.maker, min(pc.ram) over() as minram FROM pc INNER JOIN Product P ON P.model = PC.Model) pc
INNER JOIN
Product pr
ON
pc .maker = pr.maker AND
pr.type = 'printer'
WHERE
pc.Ram = pc.minram
) a
WHERE
a.speed = a.maxspeed
我相信你首先要过滤到只有制造打印机的个人电脑制造商,这些个人电脑中所有个人电脑都是最少的
然后从该子集中找到最快的pc
但是如果你想找到那些ram最小并且速度最高的PC(不仅仅是低ram规格中最快的那款),那么你可以将最大速度超过min ... ram子句,抛弃最外层的查询并将maxspeed条件放在与min ram条件相同的位置