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'