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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2010, 02:09   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию Запрос с объединением таблиц

Доброго времени суток))

Товарищи , помогите разобраться -
есть три таблицы -
Код:
 table STUDENT
(
  STUDENT_ID NUMERIC not null,
  SURNAME    VARCHAR(60),
);
table SUBJECT
(
  SUBJ_ID   NUMERIC not null,
  SUBJ_NAME VARCHAR(100),
);
 table EXAM_MARKS
(
  EXAM_ID    NUMERIC not null,
  STUDENT_ID NUMERIC not null,
  SUBJ_ID    NUMERIC not null,
  MARK       NUMERIC
);
и вот необходимо составить запрос, который вывел бы фамилии студентов, получивших положительные оценки по всем предметам....
подскажите логику рассуждений при составлении подобного запроса!))
Заранее благодарю)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 21.12.2010, 15:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

тут вопрос упирается в:
1) что такое "положительные оценки" ? Подозреваю 4 и 5 ?
Или все оценки больше нуля считать "положительными" )))


2) те записи, для которых нет данных
выбирать или нет?
Поясню, допустим, студен 1 сдал один экзамен на четыре, а другой на пять.
а студент 2 сдал один экзамен на пять
а студент 3 вообще не сдавал экзамены.
вопрос - кто из них имеет "положительные оценки по всем предметам" ?


А так я бы предложил выбирать студентов,
у которых нет предметов, для которых отсутствуют записей в таблице EXAM_MARKS
(условие, что сданы все предметы)

и те, кого нет в выборке c неположительными оценками:
where STUDENT_ID not in
(select STUDENT_ID from EXAM_MARKS where MARK < 4)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.12.2010, 16:44   #3
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Serge , приветствую! ))
Конечно, вы правы - всё так и надо -
Цитата:
А так я бы предложил выбирать студентов,
у которых нет предметов, для которых отсутствуют записей в таблице EXAM_MARKS
(условие, что сданы все предметы)
+
те, кого нет в выборке c неположительными оценкам
теперь пробую составить запрос....(вроде как вы подсказали ключевой момент)))-
Код:
not in
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 21.12.2010, 20:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

vedro-compota, надеюсь, всё получилось?

если не получится - пишите, вместе набросаем запросец!


К слову. Таблицы весьма выхолощены! По хорошему, не хватает многих сущностей. Ну я не говорю уж о дате сдачи, о учебном годе и прочих "мелочах", но, как минимум, должна была быть таблица со списком предметов, которые студенты должны были сдать в эту сессию.
Раз этой таблицы нет, то можно считать, что студенты должны сдать ВСЕ предметы из имеющихся в таблице SUBJECT
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.12.2010, 13:49   #5
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
надеюсь, всё получилось?
Да )) Спасибо )) - в рамках этого задания вроде так надо (3- это вроде положительная оценка...так говорят..))) -
Код:
SELECT STUDENT_ID,SURNAME  FROM STUDENT WHERE STUDENT_ID NOT IN (SELECT STUDENT_ID FROM EXAM_MARKS WHERE MARK < 3);
только вот в задании почему-то говорилось что необходимо исключить повторение одинаковых строк - откуда при таком запросе могут взяться одинаковые строки?
Цитата:
Таблицы весьма выхолощены!
ну это я их так...... - чтобы не отвлекать людей на чтение названий столбцов))
Serge, логика подзапросов вроде теперь е понятна.......но чтобы наглядно доказать то, что у студента все оценки положительные -и вообще вывести на экран таблицу - с множеством столбцов (в этом примере - так -
Код:
фамилия - оценка1-оценка2-оценка3
-и т.д.) - какова должна быть логика ? Ведь в той части Select , где указываются выбираемые столбцы - необходимо явно запрашивать необходимые столбцы (сколько столбцов перечислил - столько и получил...)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 25.12.2010 в 13:57.
vedro-compota вне форума Ответить с цитированием
Старый 28.12.2010, 09:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
только вот в задании почему-то говорилось что необходимо исключить повторение одинаковых строк - откуда при таком запросе могут взяться одинаковые строки?
в таком случае - не могут..
но запросы - они же разные могут быть. и, если бы в запросе получались данные из двух связанных таблиц: STUDENT и EXAM_MARKS то по каждому студенту выведется столько строк, сколько у студента оценок... тогда может и прийдётся сворачивать результаты запроса...


Цитата:
но чтобы наглядно доказать то, что у студента все оценки положительные -и вообще вывести на экран таблицу - с множеством столбцов (в этом примере - так
а вот тут поаккуратнее!
Дело в том, что классический SQL предназначен для получения данных в виде, соответствующем понятию реляционных БД - столбы - это различные характеристики (сущности), а строки - значения (величины) этих сущностей.
"разворот" реляционных данных в строчку - противоречит принципам SQL и обычно выполняется с помощью разных приёмов и трюков... (а часто такие вещи можно решить только с помощью серверной логики (скрипты, Transact-SQL, PL/SQL и т.д.)

Поэтому, прежде чем решить, что Вам РЕАЛЬНО нужно получить оценки в одну строчку - нужно трижды подумать! Точно ли это надо? Сколько оценок будет у каждого студента? Что будет для тех, у кого, допустим две оценки по одному предмету и т.д. и т.п....

Традиционное решение такое: делается столько UNION (или вложенных запросов) сколько различных столбцов с оценками будет в результирующей выборке.
и потом они собираются в одну строчку...
в качестве иллюстрации посмотрите тему: Запрос со связанными таблицами
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.12.2010, 12:57   #7
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Спасибо, Serge . Действительно.....это перегиб)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на выборку из нескольких таблиц bullvinkle Microsoft Office Access 9 11.04.2012 04:35
Запрос из двух таблиц SERG1980 БД в Delphi 8 18.11.2010 23:05
Запрос из двух таблиц T@tali Microsoft Office Access 0 18.05.2010 21:32
запрос из 2-х таблиц Lokos SQL, базы данных 9 23.12.2009 00:55
Запрос по выборке таблиц в Accesse. Droid БД в Delphi 3 25.11.2009 15:55