|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Связь между таблицами
Добрый день. Мне необходимо отобразить данные в 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, если что Я Надеюсь очень на вас! Мне до завтра надо сделать это! |
#2
|
|||
|
|||
А если попробовать руками такой запрос?
Код:
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
|
|||
|
|||
как передать данные из 3 таблицы
Цитата:
как тогда допустим передать данные из третий таблицы в первую, отдельным полем, мне надо, чтобы в главное таблице был и производить, и модель, как это реализовать тогда? |
#4
|
||||
|
||||
А вы случаем это одной строкой не вставляете? Строка то длинная получается. Попробуйте просто разбить на несколько строк.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
Да и потом, на кой вам столько лишних полей? Оставьте только то, что реально нужно для отображения.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Цитата:
Ну так и делать. через 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 |