2014-09-25 94 views
0

我有相關的父表與下面的架構3個表:MySQL的自然連接3個相關的父表與父表contraint表

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

Product表是父表PC,LaptopPrinter。 三個子表具有引用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'; 

這是爲了查詢我信息的有效方法是什麼?我覺得我輸入的方式太多,並重復許多相同的約束條件來實現我的結果。

有沒有更好的查詢,我可以寫?

謝謝。

回答

0

好增加efiiciency使用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/

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' 
+0

我試過了,它給了我錯誤: – jor 2014-09-25 09:06:46

+0

@JulioReyes什麼錯誤? – artm 2014-09-25 09:11:09

+0

@JulioReyes嘗試編輯1 – artm 2014-09-25 09:16:48