![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
moriturus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Да, это задачка с sql-ex
но я всю голову сломал ![]() Схема БД состоит из четырех отношений: Задачко: 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 представляет производителя (maker), номер модели (model) и тип (PC - ПК, Laptop - ПК-блокнот или Printer - принтер). Предполагается, что номера моделей уникальны для всех производителей и типов продуктов. В отношении PC для каждого номера модели, обозначающего ПК, указаны скорость -speed (процессора в мегагерцах), общий объем RAM (в мегабайтах), размер диска -hd (в гигабайтах), скорость считывающего устройства CD (например, 4х) и цена - price. Отношение Laptop аналогично отношению РС за исключением того, что вместо скорости CD содержится размер экрана -screen (в дюймах). В отношении Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный - Laser, струйный - Jet или матричный - Matrix) и цена. Задание: 14 Для таблицы Product получить результирующий набор в виде таблицы со столбцами maker, pc, laptop и printer, в которой для каждого производителя требуется указать, производит он (yes) или нет (no) соответствующий тип продукции. В первом случае (yes) указать в скобках без пробела количество имеющихся в наличии (т.е. находящихся в таблицах PC, Laptop и Printer) различных по номерам моделей соответствующего типа. Написал вот это, типо правильно на 1 базе, а на другоц нет мое решение;
Спасибо всем кто поможет Добавлено через 3 минуты и 25 секунд з.ы. к этой задачке там есть подсказка, но я ее сразу учел |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
Так бывает, на вид вроде правильно, но ...
У меня решение немного другое:
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
moriturus |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Спасибо большое. Но так вообще неправильно выходит даже на основной базе
когда так:
вообще ответы неверные если не сойдет за выклянчивание полного решения - то что вот здесь?
собственно как проверку строите? |
||||
|
|||||
Kangaroo |
|
|||
![]() AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: нет Всего: 104 |
moriturus,
проверку нужно делать по табличке Product. Там в ФАКе написано, что может быть вариант yes(0), то есть производитель делает компьютеры, но в данный момент на складе этой модели нету (то есть этой модели нету в табличке ПС) Я как-то так проверял:
-------------------- Lost.... |
|||
|
||||
moriturus |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
так если такая проверка, то как раз и смотрит производят ли вообще сделал и так
тот же результат если убрать
faq 14 |
||||||
|
|||||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
moriturus, тебя не поймешь
![]() а то повторю Kangaroo смотри внимательно может быть вариант yes(0). Я предложил exists потому что он более понятно подходит в данном вопросе, т.е. существует запись для производителя А и с типом 'pc'. Добавлено через 1 минуту и 40 секунд moriturus, так ты решил или нет? -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
moriturus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
А я тебя не понял
![]() у меня какая-то принципиальная ошибка в запросе, но то что есть производители у которых нет моделей в наличии я сразу учел попросил намекнуть куды копать ты предложил проверять существование - чего? моделей - то же самое выходит вот и все если ты проверку другую делаешь. то какую? - словами, а не кодом - раз волнуешься ![]() Добавлено через 1 минуту и 46 секунд нет, я не решил с exists тоже самое - правильно на основной - неправильно на тестовой |
|||
|
||||
Deniz |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
именно.
вот почему
CASE опустил он сейчас не играет роли, так вот если производитель производит 'pc', то в таблице продукт есть запись производитель-'A', модель-'12345', type-'pc', но если у него нет моделей на складе (в таблице PC), то такой запрос что должен вернуть? У меня в запросе есть left join как раз для этого. Переделай свой последний запрос на
![]() PS:
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||
|
|||||||
Kangaroo |
|
|||
![]() AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: нет Всего: 104 |
moriturus,
чуть изменил твой запрос и прошло проверку ) Подсказка. Нужно изменить эти условия:
Попробуй, если что - выложу решение. Это сообщение отредактировал(а) Kangaroo - 19.2.2008, 15:11 -------------------- Lost.... |
|||
|
||||
moriturus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
неа... но не выкладывайте пока. я что-то туплю, но сам сделаю
Это сообщение отредактировал(а) moriturus - 20.2.2008, 10:41 |
|||
|
||||
moriturus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Deniz. Заменил - то же самое ![]() Добавлено через 7 минут и 28 секунд Kangaroo7 - спасибо. Я давно понял, что дело именно в этом условии... |
|||
|
||||
moriturus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Притом я не понимаю, если ошибка именно в том, что я не учитываю возможность отсутствия наличия. то почему по производителю Е все пучком, в основной базе именно по нему 3 модели в продакт, а в пк только 1, и мой запрос правильно по нему данные показывает...
|
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
moriturus, ну давай по порядку. Разберем запрос на примере PC.
left join хорошо, т.е. в запрос попадут записи из product у которых pr.model = pc.model. Далее если нет модели в PC, то что будет для условия pr.model = pc.model? Попадут все производители, независимо от того, производят они PC или нет. Как их отсечь? добавить доп. ограничение в where. Далее чем отличается case when COUNT(DISTINCT pc.model)=0 и case when COUNT(DISTINCT pr.model)=0 для результата? ответ, считаем кол-во моделей для таблицы PC и для Product. При условии что они есть на складе результат одинаковый, а если их на складе нет? Все. Твой последний запрос с небольшими изменениями дает правильный результат. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
moriturus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
я сдаюсь. я дурак
если вместо left join использовать inner, то сразу будут только те какие в наличии - то есть только если pr.model = pc.model и при count(pc.model) тоже только то,что есть а зачем left join и условие where дополнительные - я не допираю если делать так
то если модели нет в пс то она и не попадет в запрос... Это сообщение отредактировал(а) moriturus - 20.2.2008, 13:06 |
|||
|
||||
Deniz |
|
||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
Твой запрос подправил так:
Рассказываю в case when проверить работает ли поставщик с PC
и уже потом получаешь 'yes(0,1,2,3)' или 'no' и т.д. PS: что-то www.sql-ex.ru не отвечает. Долго бился над 41 задачей(решил), мозги заворачиваются. ![]() PSS: ... product pr left join pc on pr.model=pc.model ... Left делает выборку всех записей с левой таблицы(в данном случае product) и только тех записей с правой(у нас PC) для которых выполняется условие после on т.е. pr.model=pc.model, если записей нет в выбираемые поля подставляется null. Запусти простой select типа
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "Общие вопросы по базам данных" | |
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |