Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-запрос из двух связанных таблиц 
V
    Опции темы
ezhik90
Дата 6.9.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



Имеются таблицы bal (оценки) с полями nom (номер студента), pr_name(предмет), dat(дата), bal(оценка) и
tem(темы) c полями dat(дата), gr_name(группа), pr_name(предмет), tem(тема).
При клике в таблицу на фамилию студента в другой таблице должен быть следующий вывод:
Дата, тема, оценка. То есть поля dat и bal из таблицы bal и поле tem из таблицы tem.

Код

ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select bal.dat, bal.bal, tem.tem from bal, tem');
ADOQuery2.SQL.Add('where bal.nom='''+ADOQuery1.Fields[1].AsString+''' and tem.gr_name='''+DBLookupComboBox1.Text+''' and tem.pr_name='''+DBLookUpComboBox2.Text+''' and tem.dat=bal.dat');
ADOQuery2.SQL.Add('ORDER BY dat');
ADOQuery2.Open;


При таком запросе не показывается ничего, поскольку что-то с темами не так.

Как правильно составить подобный запрос?
PM MAIL   Вверх
Данкинг
Дата 6.9.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(ezhik90 @  6.9.2010,  19:57 Найти цитируемый пост)
поскольку что-то с темами не так.

А что с ними не так? СУБД какая?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
cat512
Дата 6.9.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



Цитата(ezhik90 @ 6.9.2010,  18:57)
Имеются таблицы bal (оценки) с полями nom (номер студента), pr_name(предмет), dat(дата), bal(оценка) и
tem(темы) c полями dat(дата), gr_name(группа), pr_name(предмет), tem(тема).
При клике в таблицу на фамилию студента в другой таблице должен быть следующий вывод:
Дата, тема, оценка. То есть поля dat и bal из таблицы bal и поле tem из таблицы tem.

Код

ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select bal.dat, bal.bal, tem.tem from bal, tem');
ADOQuery2.SQL.Add('where bal.nom='''+ADOQuery1.Fields[1].AsString+''' and tem.gr_name='''+DBLookupComboBox1.Text+''' and tem.pr_name='''+DBLookUpComboBox2.Text+''' and tem.dat=bal.dat');
ADOQuery2.SQL.Add('ORDER BY dat');
ADOQuery2.Open;


При таком запросе не показывается ничего, поскольку что-то с темами не так.

Как правильно составить подобный запрос?

Не корректная структура бд. как минимум надо свяхать студентов и темы внешним ключом, его у тебя нет. А по хорошему надо
нормализовать структуру - сделать связь M<->M (многие ко многим )между студентами и  предметами , а между предметами и темами 1-->M, или оганичится иерархией тем у которых родитель - предмет.

Добавлено через 4 минуты и 12 секунд
Да, и связать группу со сткдентами связью 1->M
PM MAIL   Вверх
ezhik90
Дата 7.9.2010, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



Цитата(Данкинг @  6.9.2010,  21:00 Найти цитируемый пост)
А что с ними не так? СУБД какая? 

MS SQL Server 2008. Что не так - понять не могу, но что-то в условии. Ведь в результате оценки не отображаются.


cat512, связи  эти есть и ключи имеются. просто не уточнил об этом.
PM MAIL   Вверх
cat512
Дата 7.9.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



ну так в запросе где связь  по ключю??? 

PM MAIL   Вверх
ezhik90
Дата 7.9.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



Цитата(cat512 @  7.9.2010,  09:01 Найти цитируемый пост)
ну так в запросе где связь  по ключю??? 

Ключами связаны оценки и студенты через поле nom. Темы здесь не связаны. Мне просто надо чтобы выводилась тема, где pr_name = pr_name из оценок, gr_name = группе студента и дата из оценок опять же.
попробовал прописать это в where, но что-то не так...

Также связаны предметы и темы, группы и студенты, студенты и оценки.

Это сообщение отредактировал(а) ezhik90 - 7.9.2010, 10:13
PM MAIL   Вверх
superVad
Дата 7.9.2010, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Смотрел я смотрел. Что то в структуре не то. Нормализировать надо что ли...

Например в таблице тем ввести ключевое поле и по нему связать с таблицей оценок. Тогда в оценках будут лишними поля предмет и дата. Но это так - не видя всей базы.
PM MAIL   Вверх
ezhik90
Дата 7.9.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



superVad, в данной ситуации вывод тем с оценками не более чем оригинальная затея.... Так что в базе такая связь не нужна. Думаю, может просто сделать 3й DBGridEh для вывода отдельно тем...
PM MAIL   Вверх
cat512
Дата 9.9.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



Цитата(ezhik90 @ 7.9.2010,  17:30)
superVad, в данной ситуации вывод тем с оценками не более чем оригинальная затея.... Так что в базе такая связь не нужна. Думаю, может просто сделать 3й DBGridEh для вывода отдельно тем...

Да хоть 10-й SuperDBGrid ставь, Imho "из этого рая не выйдет ни.....чего". Тебе ясным языком сказали, пока нормально не свяжешь сущности( таблицы), правильного результата не получишь
PM MAIL   Вверх
ezhik90
Дата 10.9.2010, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



cat512, как же тогда их лучше всего связать?
есть таблицы:
    студенты (фио, номер, группа)
    группы (название группы)
    предметы (название предмета)
    оценки (дата, предмет, номер студента, оценка)
    темы (предмет, группа, дата, тема)

PM MAIL   Вверх
superVad
Дата 10.9.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



как то так (щас нарисовать не знаю в чем)

группы (номер_группы, название_группы)
студенты (номер_студента, номер_группы, фио)
предметы (номер_предмета, название_предмета)
темы (номер_темы, номер_предмета, номер_группы, дата, название_темы)
оценки (номер_студента, номер_темы, оценка)

потом данные такого (наверное) запроса фильтровать по мере надобности по номеру студента
Код

select студенты.номер_студента, темы.дата, темы.название_темы, оценки.оценка
from студенты, темы, оценки
where студенты.номер_студента=оценки.номер_студента and оценки.номер_темы=темы.номер_темы
order by студенты.номер_студента, темы.дата, темы.название_темы

PM MAIL   Вверх
ezhik90
Дата 11.9.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



Цитата(superVad @  10.9.2010,  18:41 Найти цитируемый пост)
темы (номер_темы, номер_предмета, номер_группы, дата, название_темы)

Как тогда организовать номер темы, если планируется добавление тем с нескольких десятков компьютеров???
PM MAIL   Вверх
cat512
Дата 11.9.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



Цитата(ezhik90 @ 11.9.2010,  10:04)
Цитата(superVad @  10.9.2010,  18:41 Найти цитируемый пост)
темы (номер_темы, номер_предмета, номер_группы, дата, название_темы)

Как тогда организовать номер темы, если планируется добавление тем с нескольких десятков компьютеров???

Что-то я непойму, а в чём проблемма -то? Пусть хоть миллион коннектов к серверу бд. Мне кажется ты не совсем правильно понимаешь технологию рабботы с серверами БД. Немного проясню:
Обычно люди пользуются Case- средствами которые позволяют создать логическую модель сущность- связь, и преобразовать её в физическую модель конкретного сервера БД. После того как физ. модель реализованна на сервере, на клиенте затачивается UI(юзверь интерфейс) под конкретную модель.
Соответсвенно, в твоём случае, отталкиваемся от модели которую подсказал тебе SuperVad,
ты должен создать формочку добавления записей(сущностей) в табличку тем. В табличке тем
у тебя три ключа, один Primary(собственно id темы), два других внешние на табличку предметов и на табличку групп. Id темы должен быть Автоинкрементным или генерироваться средствами сервера.
запрос добавления записи будет выгляядеть примерно так
Код

Insert into Themes(
  ID,
  PREDMET_ID,
  Group_ID,
  NAME
  )
Values(
  GenerateID, --зависит от сервера (в mssql можно создать автоинкрем. поле, тогда Id можно не вставлять )
  pIyemId, -- Параметр Id предмета
  pGroupId, -- Параметр Id группы
  'Мат анализ' -- имя темы
  )




Это сообщение отредактировал(а) cat512 - 11.9.2010, 14:05
PM MAIL   Вверх
cat512
Дата 11.9.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



Также. ты должен будеш реализовать Интерфейс заполнения табличек Групп, Студентов, Предметов, и табличек связей между ними, если таковые имеются. Таким образом ты получиш более менее рабочую систему, отражающую модель предметной области

Это сообщение отредактировал(а) cat512 - 11.9.2010, 14:08
PM MAIL   Вверх
ezhik90
Дата 11.9.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



Цитата(cat512 @  11.9.2010,  17:48 Найти цитируемый пост)
Мне кажется ты не совсем правильно понимаешь технологию рабботы с серверами БД.

я не знаю синтаксис SQL и вообще впервые столкнулся с серверными бд на практике. но принципы работы знаю

подстановку ID нашёл как организовать - через IDENTITY (использую MS SQL Server 2008)

Это сообщение отредактировал(а) ezhik90 - 11.9.2010, 15:23
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0768 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.