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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2012, 11:43   #1
Never74
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 20
Вопрос [SQL] Связь нескольких таблиц

Приветствую всех, у меня проблема.
Не могу связать несколько таблиц с одной таблицей.
Использую компонент ADOQuery

Гл.таблица(Родительская таблица): Students
Вторичные таблицы(Дочерние таблицы): Pasport, Predki

Код:
SELECT * 
FROM Students
LEFT JOIN  Pasport ON  Students.ID_CoD_Student = Pasport.ID_CoD2_Pas
LEFT JOIN  Predki ON Students.ID_CoD_Student = Predki.ID_CoD2_Pred
Запрос не выходит, выдаёт ошибку синтаксиса и выкидывает мне строку [Students.ID_CoD_Student = Pasport.ID_CoD2_Pas
LEFT JOIN Predki ON Students.ID_CoD_Student = Predki.ID_CoD2_Pred]


Помогите пожалуйста, уже весь измучился.
Заранее спасибо
Never74 вне форума Ответить с цитированием
Старый 20.01.2012, 11:53   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Не уверен, но по моему при таких запросах к ACCESS требовались скобки

как то так
Код:
SELECT * 
FROM ((Students
LEFT JOIN  Pasport ON  Students.ID_CoD_Student = Pasport.ID_CoD2_Pas)
LEFT JOIN  Predki ON Students.ID_CoD_Student = Predki.ID_CoD2_Pred)
может и тут также.
vovk вне форума Ответить с цитированием
Старый 20.01.2012, 12:10   #3
Never74
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 20
По умолчанию

vovk, спасибо Помогло Но проблема....
Появились дублирующие записи...

Последний раз редактировалось Never74; 20.01.2012 в 12:38.
Never74 вне форума Ответить с цитированием
Старый 20.01.2012, 14:52   #4
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Прочитал внимательно запрос, и думаю что вам без вложенного запроса тут не обойтись, как то так
Код:
SELECT * 
FROM (select * from Students
LEFT JOIN  Pasport ON  Students.ID_CoD_Student = Pasport.ID_CoD2_Pas) as st
LEFT JOIN  Predki ON st.ID_CoD_Student = Predki.ID_CoD2_Pred
Зря вы не прикладываете описание таблиц, и связей.
Возможно существуют и другие, более правильные решения.

Кстати я у вас вижу возможные слабые места. Это таблица
Цитата:
Predki
ведь есть возможность, что в одном учебном заведении учатся дети одних родителей, тогда что придётся их в таблице
Цитата:
Predki
2 или больше раз записывать? Или вообще отец (или мать, или дедушка (а что?)))) студента, тоже обучаются в этом заведении .
Мне кажется, что логичнее было бы завести таблицу Persons, и всех реальных людей записывать туда 1 раз, а связи между ними описывать с помощью отдельной таблицы.
Хотя у этого подхода возможно тоже есть слабые стороны.

Последний раз редактировалось vovk; 20.01.2012 в 14:54.
vovk вне форума Ответить с цитированием
Старый 20.01.2012, 15:15   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Судя по названиям таблиц Pasport - таблица с паспортными данными студента. Для каждого студента там одна запись (ну не два же паспорта у человека). Из-за нее наврядли дублирование. Если я угадал, то вообще не было смысла эти данные в отдельную таблицу заносить. А вот Predki - это папа с мамой, две записи. Может быть конечно и одна. В этом случае ни первый, ни второй вариант от дублирования записей не спасет. Нужно послушать ТС - что он хочет получить от запроса, желательно на примере
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.01.2012, 17:27   #6
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Ну если в таблице паспорт требуется хранить данные только о текущем паспорте, то да разделять смысла нет.
А вот если информация о ранее выданных паспортах (замена по утере, смене фамилии, порче) хранится, то в отдельной таблице смысл есть.

Вложенный запрос я предложил представив вариант, что в таблице Pasport и Predki есть повторы ID студента, тогда они могли перемножаться.
Но полных дублей быть не должно было, так что действительно надо ждать ТС.

Последний раз редактировалось vovk; 20.01.2012 в 17:29.
vovk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь таблиц flyinsky Microsoft Office Access 3 05.12.2010 11:23
Связь таблиц Etlau Помощь студентам 0 27.12.2009 15:10
Связь таблиц в SQL через Delphi Edelweiss Помощь студентам 1 09.11.2009 12:44
Связь таблиц maximorion БД в Delphi 1 22.05.2009 11:30
Связь таблиц БД kaa БД в Delphi 5 18.09.2007 18:29