|
Вопрос # 5 511/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
У меня такой вопрос: есть три таблицы (описание в приложении). В первой таблице содержится информация по студентам, во второй - информация по предметам, в третьей два поля - первое: id предмета, второе: id студента, проходившего тест по этому предмету.
Вопрос: как правильно составить SQL запрос для выборки всех предметов, по которым проходил тест определенный студент?
Приложение: Переключить в обычный режим- // C Builder 6.0, Win XP, InterBase
-
-
- CREATE TABLE "MAKERS_TBL"
- (
- "ID" INTEGER NOT NULL,
- "NAME" VARCHAR(50) default NULL,
- "INFO" VARCHAR(255) default NULL,
- "LINK" VARCHAR(255) default NULL,
- "RATING" INTEGER default NULL,
- "REGDATE" DATE default NULL,
- UNIQUE ("ID")
- );
-
- CREATE TABLE "SUBJECTS_TBL"
- (
- "ID" INTEGER NOT NULL,
- "NAME" VARCHAR(100) default NULL,
- "INFO" VARCHAR(255) default NULL,
- "RATING" INTEGER default NULL,
- "THEME" INTEGER default NULL,
- UNIQUE ("ID")
- );
-
- CREATE TABLE "SUBST_TBL"
- (
- "SUBJ_ID" INTEGER NOT NULL,
- "MAKER_ID" INTEGER NOT NULL,
- UNIQUE ("SUBJ_ID", "MAKER_ID")
- );
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 19 июля 2011, 01:39
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Мережников Андрей
Здравствуйте, IlluminatI!
SELECT * FROM subjects_tbl,subst_tbl
WHERE (subjects_tbl.id=subst_tbl.subj_id)AND(subst_tbl.maker_id=здесь ID студента)
 |
Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 19 июля 2011, 05:57
Оценка за ответ: 5
Комментарий к оценке: спасибо)
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 19 июля 2011, 18:39; участников в обсуждении: 4.
|
bugmenot (статус: 3-ий класс), 19 июля 2011, 09:06 [#1]:
Чтобы избежать богомерзких декартовых объединений, предлагаю использовать кошерный синтаксис:
SELECT * -- здесь исключить синтетические колонки, мне лень
FROM SUBJECTS_TBL
INNER JOIN SUBST_TBL ON SUBJECTS_TBL.ID = SUBST_TBL.SUBJ_ID
INNER JOIN MAKERS_TBL ON SUBST_TBL.MAKER_ID = MAKERS_TBL.ID
и оформить в виде представления
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
bugmenot (статус: 3-ий класс), 19 июля 2011, 11:22 [#2]:
Цитата (IlluminatI):
еще бы с синтаксисом разобраться)
Как всегда, рекомендую Мартина Грубера. А вообще это паттерн, реализующий связь многие-ко-многим.
Кстати, с Database Desktop поставляется файл localsql.hlp там есть примитивненько расписанный синтаксис для быстрого ознакомления.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
19 июля 2011, 11:46: Вопрос перемещён из тематического раздела C++ в раздел Разные вопросы модератором Ерёмин А.А. Причина: при чём тут С++?
|
IlluminatI (статус: 2-ой класс), 19 июля 2011, 12:31 [#3]:
Спасибо, ознакомлюсь и с тем, и с тем.
|
|
firstvirus (статус: 1-ый класс), 19 июля 2011, 13:12 [#4]:
С такими запросами нет ничего сложного
SELECT колонки_для_выбора FROM таблица INNER JOIN таблица2 ON таблица2.УникПоле=таблица.Определенное значение WHERE таблица.поле='значение'
таким макаром можно подключать любое количество второстепенных таблиц к основной, причем условии выборки можно добавлять из любой привязанной таблицы.
Кодер второго поколения.
|
19 июля 2011, 17:37: Статус вопроса изменён на решённый (изменил автор вопроса — IlluminatI)
|
Мережников Андрей (статус: Абитуриент), 19 июля 2011, 17:58 [#5]:
Цитата (bugmenot):
Чтобы избежать богомерзких декартовых объединений, предлагаю использовать кошерный синтаксис:
приведенный Вами запрос даст не тот результат, который требуется в запросе.
|
|
bugmenot (статус: 3-ий класс), 19 июля 2011, 18:39 [#6]:
Цитата (Мережников Андрей):
приведенный Вами запрос даст не тот результат, который требуется в запросе.
Он раскроет ∞-∞, а дальше можно что угодно делать
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|