Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2011, 18:37   #1
BarbarisXX
Новичок
Джуниор
 
Регистрация: 30.04.2011
Сообщений: 3
Вопрос Запрос на принадлежность

Очень прошу помощи)
У меня есть 3 таблицы из БД :

1) Постановки(КодП, название, жанр)
2) Режиссёры(КодР,фамилия,гражданство)
3) Ставят(КодП,КодО)

Режиссёры могут ставить одну постановку совместно с другим режиссёром. И в этом вопрос надо вывести постановки, который поставил режессёр А, но не ставил B.
BarbarisXX вне форума Ответить с цитированием
Старый 30.04.2011, 19:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы не ошиблись, в Ставят именно КодО? И что это? Код режиссёра, смею полагать?

можно так:
Код:
select Pst.* from Постановки Pst, Режиссёры Rs, Ставят St
  where Pst.КодП = St.КодП and St.КодО = Rs.КодР
    and Rs.фамилия = 'A'
  and Pst.КодП not in 
    (select St2.КодП from Режиссёры Rs2, Ставят St2
  where  St2.КодО = Rs2.КодР
    and Rs2.фамилия = 'B')
а ещё можно аналогичный запрос написать, только для внутренних подзапросов использовать конструкции EXISTS и NOT EXISTS...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.04.2011, 21:50   #3
BarbarisXX
Новичок
Джуниор
 
Регистрация: 30.04.2011
Сообщений: 3
По умолчанию

Да, ошиблась, это КодР )

я вот так же реализовала, но нам сказали без вложенных sub-select'ов,
а вот другие варианты не могу придумать(
BarbarisXX вне форума Ответить с цитированием
Старый 01.05.2011, 10:01   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
вот так же реализовала, но нам сказали без вложенных sub-select'ов
э.... тогда я умываю руки...

я тоже не вижу способов решить задачу без использования подзапросов (в случае NOT EXISTS тоже будет подзапрос)

впрочем, Вы хотите извращений?!!
Их есть у меня!
Проверяйте, запрос вернёт все постановки режиссёра, которые он ставит САМ (исключительно один - это используется в запросе):
Код:
select Pst.КодП, Pst.Название, Pst.Жанр
 from Постановки Pst, Режиссёры Rs, Ставят St, Ставят St2, Режиссёры Rs2
  where Pst.КодП = St.КодП and St.КодР = Rs.КодР
    and Rs.фамилия = 'Серебрянников'
    and St2.КодР = Rs2.КодР
    and St.КодП = St2.КодП
group by  Pst.КодП, Pst.Название, Pst.Жанр
having count(*)=1
p.s. но вообще-то, либо я не вижу тот вариант, которому Вас хотят научить,
либо Вас учат плохому - варинат запрос без подзапросов мало того, что плохо понятен,не очевиден, не эффективен, но он ещё и очень "своенравен"...

p.p.s. Когда узнаете, обязательно расскажите, какой же вариант до Вас пытался донести преподаватель!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2011, 10:32   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А если так:
Код:
SELECT  p.Название,count(s.Кодп)
from Ставят s
left join Постановки p ON (p.Кодп=s.Кодп)
left join Режиссёры r ON (s.Кодр=r.Кодр)
Group BY  p.Название 
where count(s.Кодп)=1
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2011, 11:26   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
И в этом вопрос надо вывести постановки, который поставил режессёр А, но не ставил B.
Stilet, Виталий, мне кажется, что Ваш запрос решает чуть-чуть другую задачу (выводит все постановки, где режиссёр только один)...

добавлено
кроме того, этот запрос вообще не работает в MS Access...

Последний раз редактировалось Serge_Bliznykov; 01.05.2011 в 11:31.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2011, 11:37   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
решает чуть-чуть другую задачу
Поясню мысль: Таблица Ставят содержит все переплетения фильмов и режисеров, верно? Если фильм поставлен одним режисером, и больше над ним не работал никто значит и count(s.Кодп) даст единицу, потому как больше нет записей с таким фильмом и другим режисером учитывая группировку по фильму. Именно исходя из этого я и решил что можно считать кол-во именно таким способом - сколько режисеров ставило этот фильм.
Цитата:
этот запрос вообще не работает в MS Access...
У меня нет его сейчас, я с потолка писал
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2011, 11:52   #8
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
добавлено
кроме того, этот запрос вообще не работает в MS Access...
Чтобы заработало в ms access нужно добавить скобки:
Код:

SELECT  p.Название,count(s.Кодп)
from (Ставят s
left join Постановки p ON (p.Кодп=s.Кодп))
left join Режиссёры r ON (s.Кодр=r.Кодр)
Group BY  p.Название 
where count(s.Кодп)=1
Цитата:
Сообщение от Stilet Посмотреть сообщение
Именно исходя из этого я и решил что можно считать кол-во именно таким способом - сколько режисеров ставило этот фильм.
Я сначала, тоже так подумал, но возможна ситуация, когда постановку ставил режиссер А и еще какой-то С.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 01.05.2011 в 11:55.
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 12:09   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но возможна ситуация, когда постановку ставил режиссер А и еще какой-то С
Да. А при указанной автором структуре это означает что? - Что записей с таким-то фильмом будет более 1, значит группировка и предусматривалась как правильный ответ или вернее фильтрация по кол-ву элементов в группировке по кодам фильмов. Думаю именно так преподаватели и думали, давая такое задание.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2011, 12:12   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Чтобы заработало в ms access нужно добавить скобки:
угу. а ещё в WHERE нельзя использовать агрегатные функции. нужно использовать HAVING
вот так заработал:
Код:
SELECT  p.Название,count(s.Кодп)
from (Ставят s
left join Постановки p ON (p.Кодп=s.Кодп))
left join Режиссёры r ON (s.Кодр=r.Кодр)
Group BY  p.Название 
having count(s.Кодп)=1
Но, как и ожидалось, запросы вывел ВСЕ постановки, без учёта того, кто их ставил!
(т.к. в запросе не указан режиссёр A)
Например, если у нас есть пять постановок и каждую поставил один отдельный режиссёр - то такой вариант запроса выдаст все пять постановок!
А это уж точно не является решением задачи!

и ещё, в задании не совсем понятно, а если режиссёр A ставил постановки сам, совсестно с режиссёром B и ещё ставил постановки (другие) соместно с режиссёром C
то условие задачи
Цитата:
И в этом вопрос надо вывести постановки, который поставил режессёр А, но не ставил B.
предполагает, что в запросе должны быть постановки с другими режиссёрами?
например,
"Турандот" поставлена A
"Три сестры" поставлена A и B
"Дядя Ваня" поставлена A и C
"Горе от ума" поставлена C


что является ответом на задачу (т.е. что должен вернуть правильный, с точки зрения преподавателя, запрос)?!

Последний раз редактировалось Serge_Bliznykov; 01.05.2011 в 12:23.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принадлежность точки Stereo Паскаль, Turbo Pascal, PascalABC.NET 0 14.12.2010 11:26
ПРИНАДЛЕЖНОСТЬ ТОЧКИ Dar93ina Помощь студентам 1 03.12.2010 16:41
Принадлежность класса EUGY Общие вопросы C/C++ 3 11.07.2010 17:10
Принадлежность точки Forro Помощь студентам 4 26.05.2008 14:33