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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2019, 09:25
no_name222222 no_name222222 вне форума
Прохожий
 
Регистрация: 02.06.2019
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Связь между таблицами

Добрый день. Мне необходимо отобразить данные в DBgrid в Delphi 7, используя ADOQuery, SQL и Access.
Таблиц всего десять:
Главная таблица в которой есть поля, данные берутся из других таблиц:
1 производитель ноутбуков берется из таблицы "производитель ноутбуков"
2 модель ноутбука берется из таблицы "модели ноутбуков", которая связана с "производители ноутбуков"
3 производитель процессора берется из таблицы "производители процессоров"
4 тип (поколение) процессора - берется из таблицы "поколение", которая связана с "произ процессоров"
5 модель процессора - из таблицы модели, которая связана с "поколение"
6 производитель монитора - из табл "произ мониторов"
7 модель монитора - из табл модель монитора, которая связана с "произ. мониторов"
8 производитель периф. ус-ва - из табл "производители периф. ус-ва"
9 модель периф ус-ва - из табл модели периф ус-ва, которая связана с "производители"
Вот, имеется картинка связей, в которой сложно разобраться - рисунок 1
Далее, я создаю SQL-запрос - рисунок 2
ВОт он
Код:
SELECT MainTable.*, Monitor.*, Notebook.*, Periph.*, Processor.*, CreatorMonitor.*, CreatorNotebook.*, CreatorPeriph.*, PokolProcessor.*, ModelProcessor.* 
FROM Processor RIGHT JOIN (PokolProcessor RIGHT JOIN (Periph RIGHT JOIN (Notebook RIGHT JOIN (Monitor RIGHT JOIN (ModelProcessor RIGHT JOIN (CreatorPeriph RIGHT JOIN (CreatorNotebook RIGHT JOIN (CreatorMonitor RIGHT JOIN MainTable ON CreatorMonitor.cmonitor_id = MainTable.monitor_model) ON CreatorNotebook.cnotebook_id = MainTable.notebook_model) ON CreatorPeriph.cperiph_id = MainTable.periph_model) ON ModelProcessor.model_id = MainTable.processor_model) ON (Monitor.monitor_id = MainTable.monitor_creator) AND (Monitor.monitor_id = CreatorMonitor.cmonitor_idsv)) ON (Notebook.notebook_id = MainTable.notebook_creator) AND (Notebook.notebook_id = CreatorNotebook.cnotebook_idsv)) ON (Periph.periph_id = MainTable.periph_creator) AND (Periph.periph_id = CreatorPeriph.cperiph_idsv)) ON (PokolProcessor.pokol_id = ModelProcessor.model_idsv) AND (PokolProcessor.pokol_id = MainTable.processor_type)) ON (Processor.processor_id = PokolProcessor.pokol_idsv) AND (Processor.processor_id = MainTable.processor_creator);


Вставляя в ADOQuery в Delphi, после активируя его, вылезает ошибка "не поддерживается выражение объединения"

Вот файл Access, если что


Я Надеюсь очень на вас! Мне до завтра надо сделать это!



Вложения
Тип файла: rar bds.rar (23.7 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 03.06.2019, 04:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,473
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

А если попробовать руками такой запрос?
Код:
 
select mt.*, m.*
from
  MainTable mt left join monitor m on mt.monitor_id = m.monitor_id
  left join processor p on mt.processor_id = p.processor_id
Поправишь там поля если что.

Кстати, у тебя схема БД неправильная судя по картинке. Не должны все таблицы линковаться к главной. Вот примерный кусочек для монитора:
Код:
MainTable        Monitor                  Monitor_Creator
-----------      ---------                -------------------
id           |-> id                   |-> id 
monitor_id <-|   model                |   name   
                 monitor_creator_id <-|

Тут тогда получается правильно. Один производитель мониторов может имень много моделей. А главная сборка ссылается на одну из моделей, причем указать в ней монитор от одного производителя и другого производителя технически невозможно. Так же надо переделать и для всех остальных компонентов.

Последний раз редактировалось lmikle, 03.06.2019 в 04:37.
Ответить с цитированием
  #3  
Старый 03.06.2019, 11:06
no_name222222 no_name222222 вне форума
Прохожий
 
Регистрация: 02.06.2019
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию как передать данные из 3 таблицы

Цитата:
Сообщение от lmikle
А если попробовать руками такой запрос?
Код:
 
select mt.*, m.*
from
  MainTable mt left join monitor m on mt.monitor_id = m.monitor_id
  left join processor p on mt.processor_id = p.processor_id
Поправишь там поля если что.

Кстати, у тебя схема БД неправильная судя по картинке. Не должны все таблицы линковаться к главной. Вот примерный кусочек для монитора:
Код:
MainTable        Monitor                  Monitor_Creator
-----------      ---------                -------------------
id           |-> id                   |-> id 
monitor_id <-|   model                |   name   
                 monitor_creator_id <-|

Тут тогда получается правильно. Один производитель мониторов может имень много моделей. А главная сборка ссылается на одну из моделей, причем указать в ней монитор от одного производителя и другого производителя технически невозможно. Так же надо переделать и для всех остальных компонентов.



как тогда допустим передать данные из третий таблицы в первую, отдельным полем, мне надо, чтобы в главное таблице был и производить, и модель, как это реализовать тогда?
Ответить с цитированием
  #4  
Старый 03.06.2019, 12:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,705
Репутация: 52347
По умолчанию

А вы случаем это одной строкой не вставляете? Строка то длинная получается. Попробуйте просто разбить на несколько строк.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 03.06.2019, 12:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,705
Репутация: 52347
По умолчанию

Да и потом, на кой вам столько лишних полей? Оставьте только то, что реально нужно для отображения.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 03.06.2019, 19:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,473
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Цитата:
Сообщение от no_name222222
как тогда допустим передать данные из третий таблицы в первую, отдельным полем, мне надо, чтобы в главное таблице был и производить, и модель, как это реализовать тогда?

Ну так и делать. через join'ы:
Код:
select mt.*, m.model as monitor_model, mc.name as monitor_creator_name
from MainTable mt left join Monitor m on mt.monitor_id = m.id
left join Monitor_Creator mc on m.monitor_creator_id = mc.id
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter