0

我有 3 个与具有以下架构的父表相关的子表:

Product(maker, model, type)
PC(model, price, ...)
Laptop(model, price, ...)
Printer(model, price, ...)

Product表是 、 和 的PCLaptopPrinter。三个子表具有model引用该Prodcut表的外键。此外,PC、笔记本电脑和打印机没有相同的架构。

我想找出SELECT某个制造商生产的所有产品(电脑、笔记本电脑和打印机)的型号和价格的最佳方法。

我是 SQL 新手,我的直觉现在告诉我应该将父表加入每个子表,过滤结果,然后执行联合。该查询似乎返回了正确的结果。

这是我的查询:

SELECT model, price FROM Product NATURAL JOIN PC WHERE maker = 'B' UNION 
SELECT model, price FROM Product NATURAL JOIN Laptop WHERE maker = 'B' UNION 
SELECT model, price FROM Product NATURAL JOIN Printer WHERE maker = 'B';

这是查询我的信息的有效方式吗?我觉得我输入的太多了,并且重复了很多相同的约束来达到我的结果。

我可以写一个更好的查询吗?

谢谢。

4

2 回答 2

1

我不确定MySql,但像这样?

SELECT model, price 
FROM Product 
JOIN PC 
ON PC.model = Product.model
JOIN Laptop
ON Laptop.model = Product.Model
JOIN Printer 
ON Printer.model = Product.model
WHERE Product.maker = 'B'

编辑1:试试这个:

SELECT p.model, p.price 
FROM Product p
JOIN PC pc
ON pc.model = p.model
JOIN Laptop lp
ON lp.model = p.Model
JOIN Printer pr
ON pr.model = p.model
WHERE p.maker = 'B'
于 2014-09-25T08:38:30.320 回答
1

为了提高效率,请使用 UNION ALL 而不是 UNION(或 UNION DISTINCT)

SELECT model, price FROM Product NATURAL JOIN PC WHERE maker = 'B' UNION ALL
SELECT model, price FROM Product NATURAL JOIN Laptop WHERE maker = 'B' UNION ALL
SELECT model, price FROM Product NATURAL JOIN Printer WHERE maker = 'B';

执行速度的差异来自这样一个事实,UNION 需要带有索引的内部临时表(以跳过重复的行),而 UNION ALL 将创建没有此类索引的表。

即使想了解更多,请浏览文章 http://www.percona.com/blog/2007/10/05/union-vs-union-all-performance/

于 2014-09-25T09:32:50.353 回答