Форум.orn

HARD&SOFT => Программирование => Тема начата: benassi от 25 Февраля 2015, 21:54:47

Название: Вопрос по SQL, начинающего уровня
Отправлено: benassi от 25 Февраля 2015, 21:54:47
Приветствую) Уважаемые однофорумчане знающие SQL , прошу вашей помощи!
Начал по-тихоньку осваивать SQL  в свободное время (сильно не судить :police:) и вот застрял на каком вопросе, кто знает помогите разобраться. Заранее благодарен.
Схема БД состоит из четырех таблиц:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, price, screen)
Printer(code, model, color, type, price)
Нужно вывести модели(model) и цены(price) от производителя(maker) 'B'

Пишу для этого следующий запрос:

SELECT DISTINCT Product.model,PC.price AS Cena_PC,Laptop.price AS Cena_LP, Printer.price AS Cena_PR FROM Product
FULL OUTER JOIN PC ON PC.model = Product.model
FULL OUTER JOIN Laptop ON Laptop.model = Product.model
FULL OUTER JOIN Printer ON Printer.model = Product.model
WHERE maker='B'


Выводит он информацию:
(http://s017.radikal.ru/i421/1502/5b/8a8b33026941.jpg) (http://www.radikal.ru)

Вот мне нужно получить такой вид:
(http://s019.radikal.ru/i644/1502/7e/e687d8b281a2.jpg) (http://www.radikal.ru)

Подскажите, как поступить?
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: ANALGIN2 от 25 Февраля 2015, 22:43:32
Честно признаюсь, что sql даже не щупал ни разу, поэтому не уверен, что это возможно сделать его (её?) средствами. А вот простенькую предобработку на php - легко. Берутся все значения из Cena_* и если значение не равно Null , записывается в Cena (конечно, при условии, что неNull только одно в строке model).
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: I-one от 25 Февраля 2015, 22:51:08
тоже не силен в sql, но на mysql ставил бы умолчания поля не Null и именно 0. и тогда можно SELECT (`cena_pc`+`cena_lp`+`cena_pr`) AS `cena`
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: benassi от 25 Февраля 2015, 23:01:12
тоже не силен в sql, но на mysql ставил бы умолчания поля не Null и именно 0. и тогда можно SELECT (`cena_pc`+`cena_lp`+`cena_pr`) AS `cena`
Была такая идея, пробовал через ISNULL заменить на 0, а потом вышеописанным методом,  что-то там не задалось, завтра повнимательней поэкспериментирую.
ANALGIN2, I-one спасибо за проявленный интерес.
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: Eugene L. от 25 Февраля 2015, 23:02:50
в чем выполняешь запрос?
Может убрать из запроса DISTINCT цену Laptop.price? Может перед сном не понял суть, но смысла в них не вижу
После where условие на NULL и все вроде
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: Chaek от 25 Февраля 2015, 23:09:49
Я бы немного свернул
Product(ID,  modelID,  ..., etc)
Model(ID, makerID, price)
Maker (ID, Name)
PC(ID, modelID, speed, ram, hd, cd)
Laptop(ID, modelID, speed, ram, hd, screen)
Printer(ID, modelID, color, type)

то есть свойства общие для сущностей вывести в общую таблицу. много меньше гемароя при добавлении новых типов моделей
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: benassi от 25 Февраля 2015, 23:19:11
в чем выполняешь запрос?
Может убрать из запроса DISTINCT цену Laptop.price? Может перед сном не понял суть, но смысла в них не вижу
После where условие на NULL и все вроде

DISTINCT это я для фильтрации поля model сделал для исключения дубликатов, т.к. есть повторяющиеся строки. (может конечно что-то неправильно по синтаксису оформил)
Да выполняю пока в веб морде с упражнениями по sql, а далее начну на практике использовать T-SQL в MS SQL Server.
Я бы немного свернул
Product(ID,  modelID,  ..., etc)
Model(ID, makerID, price)
Maker (ID, Name)
PC(ID, modelID, speed, ram, hd, cd)
Laptop(ID, modelID, speed, ram, hd, screen)
Printer(ID, modelID, color, type)
Спасибо! правда уже после того как освою азы, направлюсь в сторону рационального использования ресурсов и правильного оформления.
Название: Re: Вопрос по SQL, начинающего уровня
Отправлено: benassi от 26 Февраля 2015, 09:26:52
тоже не силен в sql, но на mysql ставил бы умолчания поля не Null и именно 0. и тогда можно SELECT (`cena_pc`+`cena_lp`+`cena_pr`) AS `cena`
Была такая идея, пробовал через ISNULL заменить на 0, а потом вышеописанным методом,  что-то там не задалось, завтра повнимательней поэкспериментирую.
ANALGIN2, I-one спасибо за проявленный интерес.
Всем спасибо , все решил )
Вот "правильный" код:
SELECT DISTINCT Product.model,
ISNULL(PC.price,0) + ISNULL(Laptop.price,0) + ISNULL(Printer.price,0) AS price
FROM Product
LEFT OUTER JOIN PC ON PC.model = Product.model
LEFT OUTER JOIN Laptop ON Laptop.model = Product.model
LEFT OUTER JOIN Printer ON Printer.model = Product.model
WHERE maker='B'