我有3个子表与父表相关,具有以下模式:
Product(maker, model, type)
PC(model, price, ...)
Laptop(model, price, ...)
Printer(model, price, ...)
Product
表是PC
,Laptop
和Printer
的父表。
这三个子表具有引用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';
这是查询我的信息的有效方法吗?我觉得我打字太多了,并且重复了很多相同的限制来实现我的结果。
我能写一个更好的查询吗?
感谢。
答案 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/