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

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

Вернуться   Форум программистов > C/C++ программирование > C/C++ Базы данных
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2011, 11:39   #1
Гудрон
Новичок
Джуниор
 
Регистрация: 09.03.2011
Сообщений: 2
По умолчанию Подстановка данных сразу из 4 таблиц в одну в С++ Builder 6

Имеется:
1. База данных преподавателей и студентов в MS SQL Server 2005
2. В ней находится 5 таблиц: Факультеты, Группы, Преподаватели, Предметы и Основная.
3. Поля в первых 4 таблицах соответствуют их названиям (не считая целочисленные ключевые поля-идентификаторы). В них просто перечислены все группы, все преподаватели, все предметы и все факультеты
4. Последняя таблица состоит из 4 полей с теми же именами
Задача:
При введении данных в поля Основной таблицы необходимо обеспечить подстановку из таблиц Факультеты, Группы, Преподаватели и Предметы в соответствующие поля, т.е. чтобы не вводить полностью имя препода, который ведёт один из своих предметов у определённой группы на таком-то факультете, а обеспечить возможность выбора данных из динамически формирующегося списка при, скажем, установке курсора в нужное поле (это вообще было бы идеально), т.е. как в конструкторе - собрать Основную таблицу по деталям из четырёх других.
Поскольку связь в Основной таблице идёт многие ко многим, то, пожалуй, будет надобность создавать промежуточные таблицы
Вопрос:
Существуют ли способы, какие-либо select-запросы или ещё что-то, чтобы это можно было осуществить?
Гудрон вне форума Ответить с цитированием
Старый 24.03.2011, 23:20   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Ну разумеется
Смотрите в сторону LEFT/RIGHT/INNER JOIN

На примере твоей БД(если я правильно понял структуру)
table_fak - Факультеты (поле названия name)
table_group - Группы (поле названия name)
table_prep - Преподы (поле названия fio)
table_pred - Предметы (поле названия title)
table_main - Основная

Пусть ключевые поля везде будут ID (автоинкремент), а поля со связями на таблицу <имя_таблицы_id>, например table_prep_id.

Все примеры для MySQL. Для MS SQL Server их необходимо соответственно подправить

Тогда запрос на выборку будет таким (ну, в сильно упрощенном варианте)
Код:
SELECT fak.name AS 'Факультет', t_group.name AS 'Группа', prep.fio AS 'Предод', pred.title AS 'Предмет'
FROM table_main main 
	INNER JOIN table_fak fak ON main.table_fak_id = fak.id
	INNER JOIN table_group t_group ON main.table_group_id = t_group.id
	INNER JOIN table_prep prep ON main.table_prep_id = prep.id
	INNER JOIN table_pred pred ON main.table_pred_id = pred.id
Результат (выведет все записи) у меня их три.
Код:
+-----------+-----------+--------------+---------------+
| Факультет | Группа    | Предод       | Предмет       |
+-----------+-----------+--------------+---------------+
| IT        | Programer | Vasya Pupkin | C++ language  |
| IT        | Programer | Ivanov Ivan  | C++ language  |
| Builder   | Designer  | Ivanov Ivan  | Photoshop CS2 |
+-----------+-----------+--------------+---------------+
При таком запросе, некоторого факультета будет примерно таким. Данные о факультете IT
Код:
SELECT fak.name AS 'Факультет', t_group.name AS 'Группа', prep.fio AS 'Предод', pred.title AS 'Предмет'
FROM table_main main 
	INNER JOIN table_fak fak ON main.table_fak_id = fak.id
	INNER JOIN table_group t_group ON main.table_group_id = t_group.id
	INNER JOIN table_prep prep ON main.table_prep_id = prep.id
	INNER JOIN table_pred pred ON main.table_pred_id = pred.id
WHERE
	fak.name = "IT";
Выведет
Код:
+-----------+-----------+--------------+--------------+
| Факультет | Группа    | Предод       | Предмет      |
+-----------+-----------+--------------+--------------+
| IT        | Programer | Vasya Pupkin | C++ language |
| IT        | Programer | Ivanov Ivan  | C++ language |
+-----------+-----------+--------------+--------------+
При таком. Все предметы которые ведет Ivanov
Код:
SELECT fak.name AS 'Факультет', t_group.name AS 'Группа', prep.fio AS 'Предод', pred.title AS 'Предмет'
FROM table_main main 
	INNER JOIN table_fak fak ON main.table_fak_id = fak.id
	INNER JOIN table_group t_group ON main.table_group_id = t_group.id
	INNER JOIN table_prep prep ON main.table_prep_id = prep.id
	INNER JOIN table_pred pred ON main.table_pred_id = pred.id
WHERE
	prep.fio LIKE "%Ivanov%";
Код:
+-----------+-----------+-------------+---------------+
| Факультет | Группа    | Предод      | Предмет       |
+-----------+-----------+-------------+---------------+
| IT        | Programer | Ivanov Ivan | C++ language  |
| Builder   | Designer  | Ivanov Ivan | Photoshop CS2 |
+-----------+-----------+-------------+---------------+
Как видно из примеров достаточно подставить нужное условие в WHERE и запрос выведет необходимые данные

Во вложении лог консоли для MySQL и скрипт с SQL запросом. Ну и дамп БД (так на всякий)
Удачи!

P.S. Настоятельно рекомендую подробней изучить SQL.
Вложения
Тип файла: txt log_sql.txt (4.3 Кб, 175 просмотров)
Тип файла: txt q.txt (409 байт, 132 просмотров)
Тип файла: txt database.txt (4.9 Кб, 133 просмотров)

Последний раз редактировалось psycho-coder; 24.03.2011 в 23:23.
psycho-coder вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение нескольких таблиц в одну книгу Gregory_Colbert Microsoft Office Excel 6 14.09.2010 10:24
Выборка и подстановка данных. HIC БД в Delphi 10 10.09.2009 11:34
сведение данных из разных таблиц в одну SingleSpart Microsoft Office Excel 2 04.08.2009 17:04
Объединение нескольких таблиц в одну (по определенному параметру) iona БД в Delphi 13 18.06.2009 19:34
Сведение нескольких таблиц в одну Sega Microsoft Office Excel 3 05.08.2008 15:21