我有 3 个子表,它们与具有以下架构的父表相关:
Product(maker, model, type)
PC(model, price, ...)
Laptop(model, price, ...)
Printer(model, price, ...)
Product
表是 PC
、Laptop
和 Printer
的父表。
这三个子表都有一个引用 Prodcut
表的外键 model
。
此外,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';
这是查询我的信息的有效方式吗?我觉得我输入了太多内容并重复了许多相同的约束来实现我的结果。
我可以编写更好的查询吗?
谢谢。
最佳答案
为了提高效率,请使用 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/
关于MySQL NATURAL JOIN 3 与父表相关的表,并且对父表有约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26033982/