Улучшение SQL-запроса - PullRequest
1 голос
/ 04 июня 2011

Я пытаюсь улучшить свои знания SQL и делаю упражнения на sql-ex.ru.

И теперь я застрял с такой проблемой.У меня есть такая задача:

* Схема базы данных состоит из четырех таблиц:

Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)

Таблица Продукт включает в себя информацию о производителе, номер модели и тип («ПК», «Ноутбук» или «Принтер»).Предполагается, что номера моделей в таблице Product являются уникальными для всех производителей и типов продуктов.

Каждый ПК с уникальным указанием кода в таблице «ПК» характеризуется моделью (внешний ключ ссылается на таблицу «Продукт»), скоростью (процессора в МГц), общим количествомRAM - оперативная память (в Мб), емкость жесткого диска - HD (в Гб), скорость CD-ROM - CD (например, «4x»), и цена.

Таблица Ноутбук аналогичен одному из ПК, за исключением скорости CD-ROM, которая заменяется размером экрана - экраном (в дюймах).Для каждого принтера в таблице «Принтер» указывается, является ли принтер цветным или нет (атрибут цвета «у» для цветных принтеров; в противном случае это «n»), тип принтера (лазерный, струйный или матричный) ицена. *

Найдите модели ноутбуков, у которых скорость меньше, чем у всех ПК.Набор результатов: тип, модель, скорость.

Я набираю такой запрос:

SELECT 'Laptop', Laptop.model,
Laptop.speed FROM Laptop WHERE
Laptop.speed < All (SELECT speed FROM
PC)

Он работает правильно, но веб-сайт сообщает, что он не совсем корректен для любой базы данных:

Обратите внимание, что это решение будет действительным, только если продукты с типом laptop будут размещены в таблице Laptop.Для нашей базы данных это условие выполняется, потому что существует только три типа товаров и, соответственно, три таблицы.Следовательно, нарушение этого условия может быть связано только с реструктуризацией, что, однако, также следует учитывать при разработке приложений со встроенными SQL-запросами.

Что это значит?И как я могу улучшить свой запрос?Пожалуйста, объясните мне!

Ответы [ 8 ]

2 голосов
/ 05 июня 2011

Структура этой базы данных немного странна в том, как она обрабатывает модель;модель является ключом таблицы PRODUCTS.

Проверьте, работает ли этот альтернативный синтаксис в вашей базе данных;он использует так называемые «встроенные виды», чтобы разбить проблему на более мелкие этапы, которые легче понять.

  1. Найти скорость самого медленного ПК:

        select min(speed) as SlowestSpeed from PC
    
  2. Найдите ноутбуки, которые работают медленнее, чем компьютер-черепаха:

       select laptop.model, laptop.speed from laptop
       join
       ( 
        select min(speed) as SlowestSpeed from PC
       ) as MyTortoise
       where laptop.speed < MyTortoise.SlowestSpeed
    
  3. Получите информацию о модели этих медленных ноутбуков:

      select PRODUCT.model, PRODUCT.type, SlowLaptops.speed
      from PRODUCT
      inner join
      (
    
       select laptop.model, laptop.speed from laptop
       join
       ( 
        select min(speed) as TheSlowest from PC
       ) as MyTortoise
       where laptop.speed < MyTortoise.SlowestSpeed
    
      ) as SlowLaptops
    
      on PRODUCT.model = SlowLaptops.model
    
1 голос
/ 08 сентября 2013

Все запросы верны. Просто добавьте ключевое слово DISTINCT к вашему запросу.

SELECT DISTINCT type,l.model,l.speed
FROM product p,laptop l
WHERE p.model=l.model
AND l.speed < all (select speed from pc)
1 голос
/ 25 июня 2013
SELECT 'laptop' as title, 
       laptop.model,
       laptop.speed
  FROM laptop
 WHERE laptop.speed < (SELECT MIN(speed) FROM PC)
 GROUP BY model, speed
0 голосов
/ 25 сентября 2016

ВЫБЕРИТЕ отдельный тип, Laptop.model, скорость ОТ ноутбука, продукт ГДЕ тип = «ноутбук» И скорость <(ВЫБРАТЬ мин (скорость) С ПК) </p>

0 голосов
/ 09 августа 2014
     select Product.type, Laptop.model, Laptop.speed
     from Laptop join Product on (Product.model = Laptop.model)
     where Laptop.speed < ALL( select speed from PC)
     group by Laptop.model,Laptop.speed, Product.type
0 голосов
/ 07 августа 2014
SELECT DISTINCT type='Laptop', Laptop.model, Laptop.speed
FROM Laptop, PC
WHERE Laptop.speed < ALL (SELECT speed FROM PC)
0 голосов
/ 19 февраля 2014
SELECT DISTINCT Product.type, Laptop.model, Laptop.speed
  FROM Laptop, PC, Product
 WHERE Laptop.speed<(SELECT MIN(speed) FROM  PC) AND Product.type='Laptop'

Справа.

Результат Вашего запроса:

type        model   speed

Laptop      1298    350
0 голосов
/ 04 июня 2011

В вашем запросе используется отбор, который проверяет все ПК на всех ноутбуках, однако он будет более эффективно выражен, если сначала выбрать самую низкую скорость ПК и сравнить ее со всеми ноутбуками:

Примерно так:

SELECT 
  'laptop' as title
  , laptop.model
  , laptop.speed
FROM laptop
WHERE laptop.speed < (SELECT MIN(speed) FROM PC)

В этом заявлении об отказе говорится, что этот запрос работает, поскольку laptop в таблице переносных компьютеров, а PC в таблице ПК.
Если вы объединяете свои таблицы, очень мало нужно менять взапрос:

Computer (type, code, model, speed, ram, hd, screen, price)

А затем выполните запрос, подобный следующему:

SELECT 'laptop' as title
  , computer.model
  , computer.speed
FROM computer 
WHERE type = 'laptop' 
  AND computer.speed < (SELECT MIN(speed) FROM computer WHERE type = 'PC')

Конечно, отказ от ответственности является верным для любого запроса;если вы измените макет ваших таблиц, вам также потребуется изменить запрос.

Если вы хотите передать Q17, вам нужно будет выполнить соединение по продукту таблицы

Предполагается, что номера моделей в таблице Product являются уникальными для всех производителей и типов продуктов.

Итак, у вас есть уникальный ключ для присоединения.

SELECT 
  product.type
  , laptop.model
  , laptop.speed
FROM laptop
INNER JOIN product ON (laptop.model = product.model)
WHERE laptop.speed < (SELECT MIN(speed) FROM PC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...