я хочу, чтобы кто-то проверил мой код и определила синтаксическую ошибку - PullRequest
0 голосов
/ 12 октября 2019

Вопрос:

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

Вывод: производитель;если среди цен для продуктов данного производителя есть значения NULL, для этого производителя выведите NULL, в противном случае - максимальную цену.

база данных: Краткое описание базы данных "Компьютерная фирма"

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

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 содержит данные о производителе, номере модели и типе продукта («ПК», «Портативный компьютер» или «Принтер»). Предполагается, что номера моделей в таблице Product являются уникальными для всех производителей и типов продуктов. Каждый персональный компьютер в таблице ПК однозначно идентифицируется уникальным кодом и дополнительно характеризуется своей моделью (внешний ключ относится к таблице «Продукт»), скоростью процессора (в МГц) - полем скорости, объемом ОЗУ (в МБ) - оперативной памятью. , емкость жесткого диска (в Гб) - hd, скорость CD-ROM (например, «4x») - кд и его цена. Стол для ноутбука похож на стол для ПК, за исключением того, что вместо скорости CD-ROM он содержит размер экрана (в дюймах) - экран. Для каждой модели принтера в таблице «Принтер» тип вывода («y» для цвета и «n» для монохромного) - поле цвета, технология печати («Laser», «Jet» или «Matrix») - тип и цена

Код:

select maker,max( price ) 
from 
    ( 
        select maker, max( l.price) 
        from product p left join laptop l on p.model = l.model 
        group by maker 
        union all select maker, max( pr.price) 
        from product p left join printer pr on p.model = pr.model 
        group by maker 
        union all select maker, max( pc.price) 
        from product p left join pc on p.model = pc.model 
        group by maker 
    ) as h 
group by maker ;

, и это дает мне эту ошибку:

Ошибка в запросе. Код: (933) ORA-00933: SQL command not properly ended.

Я не знаю, в чем проблема.

1 Ответ

4 голосов
/ 12 октября 2019

Ваш запрос выглядит следующим образом:

SELECT ...
FROM (
    SELECT ... FROM ...
) AS h

Проблема в том, что Oracle не допускает ключевое слово AS для производной таблицы псевдонимов. Вам нужно удалить это ключевое слово.

Пример на скрипте БД :

SELECT * FROM (
    SELECT 1 FROM DUAL
) as X

ORA-00933: SQL command not properly ended

Другая проблема в вашем запросе заключается в том, что вы используете агрегирование вUNION ed подзапросов, но у вас нет псевдонимов столбцов, для которых вы используете функцию агрегирования:

select 
    maker,
    max( l.price) -- no column alias
from product p ...

Затем в подзапросе вы делаете:

select maker,max( h.price ) 

Это вызовет ошибку ORA-00904: "PRICE": invalid identifier, поскольку price не существует во внешнем запросе. Вам необходимо создать псевдоним столбца во внутренних запросах.

select 
    maker,
    max( l.price) price
from product p ...

Окончательная версия вашего запроса:

select maker,max( price ) 
from 
    ( 
        select maker, max( l.price) price 
        from product p left join laptop l on p.model = l.model 
        group by maker 
        union all select maker, max( pr.price) 
        from product p left join printer pr on p.model = pr.model 
        group by maker 
        union all select maker, max( pc.price) 
        from product p left join pc on p.model = pc.model 
        group by maker 
    ) h 
group by maker ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...