Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.10.2012, 07:59
niggle niggle вне форума
Прохожий
 
Регистрация: 18.04.2012
Сообщения: 2
Репутация: 10
По умолчанию Вопрос про ADOQuery

Все привет!!!!! Всем заранее спасибо за помощь!
Имеется Delphi 2007. БД Access. Коннект через ADO. Хочу вывести список спортсменов отделения БАДМИНТОН, через ADOQuery.

Вот такая структура БД:


[spoiler]

[/spoiler]

Выполняю вот такой SQL запрос :
Код:
select *
FROM  otdel, groupS, kdGroup, trener, sports, data, razrad, kodrazr
WHERE  otdel.Код_отделения = groupS.Код_отделения 
AND groupS.код_группы = kdGroup.код_группы
AND groupS.код_тренера = trener.код_тренера
AND groupS.код_спортсмена = sports.код_спортсмена
AND sports.код_спортсмена = data.код_спортсмена
AND sports.код_спортсмена = razrad.код_спортсмена 
AND razrad.Код_разряда = kodrazr.Код_разряда
AND otdel.отделение LIKE :otd

Выводит вот что:



У спортсменки Сысоева, есть несколько разрядов. Полученных в разные даты.
Почему её выводит несколько раз? Не могу догнать и всё

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

Проблема в Запросе? или в структуре БД?
Спасибо за любую помощь...
Ответить с цитированием
  #2  
Старый 07.10.2012, 10:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от niggle
У спортсменки Сысоева, есть несколько разрядов. Полученных в разные даты.
Почему её выводит несколько раз? Не могу догнать и всё
Потому что здесь:
Код:
FROM  otdel, groupS, kdGroup, trener, sports, data, razrad, kodrazr
у тебя происходит декартово умножение таблиц (CROSS JOIN), т.е. из 8-ми таблиц ты получаешь одну мегатаблицу в которую включаются все поля (колонки) этих таблиц и все возможные сочетания записей этих таблиц, при этом количество записей этой мегатаблицы будет равно произведению количества записей исходных 8-таблиц. После этого из этой таблицы отсеиваются записи которые не удовлетворяют условиям в WHERE. А где у тебя в WHERE есть условие, что нужно выводить только последние разряды? - Нету - Поэтому эти записи не отсеиваются и выводятся все.

Цитата:
Сообщение от niggle
Как сделать так чтобы запись выводилась только один раз, причем с последним полученным разрядом.
Попробуй, например, добавить такое условие:
Код:
AND razrad.Дата_присвоения = (SELECT MAX(razrad2.Дата_присвоения)
                              FROM razrad AS razrad2
                              WHERE sports.код_спортсмена = razrad2.код_спортсмена)

Цитата:
Сообщение от niggle
Проблема в Запросе? или в структуре БД?
А вообще лучше "CROSS JOIN" не использовать. Намного удобнее и понятнее вместо этого использовать "LEFT OUTER JOIN".
Ответить с цитированием
  #3  
Старый 07.10.2012, 11:20
niggle niggle вне форума
Прохожий
 
Регистрация: 18.04.2012
Сообщения: 2
Репутация: 10
По умолчанию

АААА poli-smen!!!! Спасибо тебе большое!!!!!!!!!! Все получилось!!!
Блин нужно с 0 изучать SQL...
Я учусь в институте, нам ни про алиасы ничего не говорили. И объясняли и требовали с нас на контрольных CROSS JOIN.

Еще раз БОЛЬШОЕ спасибо! от души!
Ответить с цитированием
  #4  
Старый 07.10.2012, 12:48
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Дополнительный запрос делать ради этого? Да ну. Лучше уж так:
Код:
select *
FROM  otdel, groupS, kdGroup, trener, sports, data, razrad, kodrazr
WHERE  otdel.Код_отделения = groupS.Код_отделения 
AND groupS.код_группы = kdGroup.код_группы
AND groupS.код_тренера = trener.код_тренера
AND groupS.код_спортсмена = sports.код_спортсмена
AND sports.код_спортсмена = data.код_спортсмена
AND sports.код_спортсмена = razrad.код_спортсмена 
AND razrad.Код_разряда = kodrazr.Код_разряда
AND otdel.отделение LIKE :otd
GROUP BY sports.код_спортсмена
ORDER BY razrad.Дата_присвоения DESC
Возможно, ORDER и GROUP надо будет поменять местами - не уверен в правильности порядка.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 07.10.2012, 12:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от PhoeniX
Дополнительный запрос делать ради этого? Да ну. Лучше уж так:
Код:
select *
FROM  otdel, groupS, kdGroup, trener, sports, data, razrad, kodrazr
WHERE  otdel.Код_отделения = groupS.Код_отделения 
AND groupS.код_группы = kdGroup.код_группы
AND groupS.код_тренера = trener.код_тренера
AND groupS.код_спортсмена = sports.код_спортсмена
AND sports.код_спортсмена = data.код_спортсмена
AND sports.код_спортсмена = razrad.код_спортсмена 
AND razrad.Код_разряда = kodrazr.Код_разряда
AND otdel.отделение LIKE :otd
GROUP BY sports.код_спортсмена
ORDER BY razrad.Дата_присвоения DESC
Возможно, ORDER и GROUP надо будет поменять местами - не уверен в правильности порядка.
По моему так не будет работать. Сейчас времени нет - вечером проверю.
Ответить с цитированием
  #6  
Старый 08.10.2012, 20:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
...Хочу вывести список спортсменов отделения БАДМИНТОН...
Так попробуйте:
Код:
select Sports.* from Sports
inner join GroupS on GroupS.Код_Спортсмена=Sports.Код_Спортсмена
inner join Otdel on Otdel.Код_Отделения = GroupS.Код_Отделения
where Otdel.Отделение="БАДМИНТОН"
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter