MySQL NATURAL JOIN 3 таблицы, связанные с родительской таблицей с ограничением на родительскую таблицу

У меня есть 3 дочерние таблицы, которые связаны с родительской таблицей со следующей схемой:

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

Product таблица является родительской таблицей PC, Laptop, а также Printer, Три дочерние таблицы имеют внешний ключ model что ссылка на Prodcut Таблица. Кроме того, ПК, ноутбук и принтер не имеют идентичных схем.

Я хочу найти лучший способ 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 ответа

Решение

Для повышения эффективности используйте 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, но что-то вроде этого?

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'
Другие вопросы по тегам