Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 511

/ вопрос решён /

Приветствую, уважаемые эксперты!
У меня такой вопрос: есть три таблицы (описание в приложении). В первой таблице содержится информация по студентам, во второй - информация по предметам, в третьей два поля - первое: id предмета, второе: id студента, проходившего тест по этому предмету.
Вопрос: как правильно составить SQL запрос для выборки всех предметов, по которым проходил тест определенный студент?

Приложение:
  1. // C Builder 6.0, Win XP, InterBase
  2.  
  3.  
  4. CREATE TABLE "MAKERS_TBL"
  5. (
  6. "ID" INTEGER NOT NULL,
  7. "NAME" VARCHAR(50) default NULL,
  8. "INFO" VARCHAR(255) default NULL,
  9. "LINK" VARCHAR(255) default NULL,
  10. "RATING" INTEGER default NULL,
  11. "REGDATE" DATE default NULL,
  12. UNIQUE ("ID")
  13. );
  14.  
  15. CREATE TABLE "SUBJECTS_TBL"
  16. (
  17. "ID" INTEGER NOT NULL,
  18. "NAME" VARCHAR(100) default NULL,
  19. "INFO" VARCHAR(255) default NULL,
  20. "RATING" INTEGER default NULL,
  21. "THEME" INTEGER default NULL,
  22. UNIQUE ("ID")
  23. );
  24.  
  25. CREATE TABLE "SUBST_TBL"
  26. (
  27. "SUBJ_ID" INTEGER NOT NULL,
  28. "MAKER_ID" INTEGER NOT NULL,
  29. UNIQUE ("SUBJ_ID", "MAKER_ID")
  30. );


IlluminatI Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

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

bugmenot (статус: 3-ий класс), 19 июля 2011, 11:22 [#2]:

Цитата (IlluminatI):

еще бы с синтаксисом разобраться)

Как всегда, рекомендую Мартина Грубера. А вообще это паттерн, реализующий связь многие-ко-многим.

Кстати, с Database Desktop поставляется файл localsql.hlp там есть примитивненько расписанный синтаксис для быстрого ознакомления.
виконання програми розпочинається з того самого мiсця, де призупинилося.

19 июля 2011, 11:46: Вопрос перемещён из тематического раздела C++ в раздел Разные вопросы модератором Ерёмин А.А. Причина: при чём тут С++?

IlluminatI

IlluminatI (статус: 2-ой класс), 19 июля 2011, 12:31 [#3]:

Спасибо, ознакомлюсь и с тем, и с тем.
firstvirus

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

bugmenot (статус: 3-ий класс), 19 июля 2011, 18:39 [#6]:

Цитата (Мережников Андрей):

приведенный Вами запрос даст не тот результат, который требуется в запросе.

Он раскроет ∞-∞, а дальше можно что угодно делать
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.03 сек.