Russian Qt Forum
Сентябрь 30, 2024, 14:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Связь между таблицами БД (QSqlRelationalTableModel)  (Прочитано 6531 раз)
svch
Гость
« : Январь 07, 2007, 11:59 »

Есть две таблицы БД, они определены так:
create table man (
   id integer not null primary key,
   name Varchar(60) NOT NULL,
   id_city Integer NOT NULL
);

create table city (
   id integer not null primary key,
   title Varchar(40) NOT NULL,
);

В TableView таблицы MAN (в поле id_city) должно отображаться поле title таблицы CITY. Это отношение я определяю так:
Код:
tableModel->setRelation(2, QSqlRelation("city", "id", "title"));

Но почему то таблица не отображается. Если я убираю строчку с определением отношения, то таблица отображается. Использую Qt 4.2 и СУБД Firebird(но это думаю неважно). Если в качестве СУБД использую SQLite, то этот код работает и таблица отображается вместе с отношением.

Подскажите пожалуйста в чем проблема? Может таблицу надо определить как-то по-другому или отношение между таблицами в QSqlRelationalTableModel? Раскажите как вы это делаете ПЛИЗ (очень надо, а то отчислят из института нафиг:) шучу)
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Январь 07, 2007, 20:57 »

скорее что то в поддержке драйвера Firebird, если все на sqllite работает!
Записан
svch
Гость
« Ответ #2 : Январь 08, 2007, 12:37 »

Цитата: "Admin"
скорее что то в поддержке драйвера Firebird, если все на sqllite работает!

Ты оказался прав на все 100 (пасиб). Я использовал Firebird 1.5.3 который уже у меня стоял когда я компилировал Qt. Qt сама нашла firebird и сделалала DLLку для поддержки firebird. Сегодня скачал свежий firebird 2.0 скомпилировал драйвер и... ВСЕ ЗАРАБОТАЛО!!!
Спасибо ув. админу за совет Веселый
Записан
Alex03
Гость
« Ответ #3 : Январь 08, 2007, 14:57 »

Порой проще сразу запрос прописать какой надо Улыбающийся

SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man;
Ну или тоже самое но с джойнами.
Записан
Steven_Orko
Гость
« Ответ #4 : Январь 08, 2007, 17:18 »

Цитата: "Alex03"

SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man;
Ну или тоже самое но с джойнами.


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

Лучше использовать следующую альтернативу:
Код:

SELECT man.id, man.name, city.title FROM man, city WHERE city.id = man.id_city;


И дополнительное связывание (джойны) вовсе не к чему, только занимать дополнительные ресурсы....
Записан
Alex03
Гость
« Ответ #5 : Январь 08, 2007, 19:48 »

Цитата: "Steven_Orko"
Цитата: "Alex03"

SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man;
Ну или тоже самое но с джойнами.


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


Зависит от используемой БД и кол-ва записей в таблицах (и прочих особенностей сервера)
Приведённый мною вариант запроса порой очень выгоден тем что внутренний запрос выполняется во время фетча записи, поэтому если основной запрос возвращает много записей а фетчится из них далеко не всё, или если первые записи результата нужны как можно быстрей то ...



Цитировать

Лучше использовать следующую альтернативу:
Код:

SELECT man.id, man.name, city.title FROM man, city WHERE city.id = man.id_city;


И дополнительное связывание (джойны) вовсе не к чему, только занимать дополнительные ресурсы....


Ваш вариант есть не что иное как неявный джойн, который вполне корректен (и логичен) для приведённого примера пока не появились другие таблицы, условия, или столбцы с нулевыми значениями (как то man.id_city).

Впрочем всё это уже не по теме.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #6 : Январь 09, 2007, 17:26 »

насчет вложенных запросов - они не везде работают!
например sqllite и mysql4 - там с эти трудновато!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.