MySQL NATURAL JOIN与父表相关的3个表,父表具有约束

时间:2014-09-25 08:32:29

标签: mysql sql select natural-join

我有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';

这是查询我的信息的有效方法吗?我觉得我打字太多了,并且重复了很多相同的限制来实现我的结果。

我能写一个更好的查询吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我不确定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'

答案 1 :(得分:0)

提高效率使用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/