Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: 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? Раскажите как вы это делаете ПЛИЗ (очень надо, а то отчислят из института нафиг:) шучу) Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: Admin от Январь 07, 2007, 20:57 скорее что то в поддержке драйвера Firebird, если все на sqllite работает!
Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: svch от Январь 08, 2007, 12:37 Цитата: "Admin" скорее что то в поддержке драйвера Firebird, если все на sqllite работает! Ты оказался прав на все 100 (пасиб). Я использовал Firebird 1.5.3 который уже у меня стоял когда я компилировал Qt. Qt сама нашла firebird и сделалала DLLку для поддержки firebird. Сегодня скачал свежий firebird 2.0 скомпилировал драйвер и... ВСЕ ЗАРАБОТАЛО!!! Спасибо ув. админу за совет :D Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: Alex03 от Январь 08, 2007, 14:57 Порой проще сразу запрос прописать какой надо :)
SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man; Ну или тоже самое но с джойнами. Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: Steven_Orko от Январь 08, 2007, 17:18 Цитата: "Alex03" SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man; Ну или тоже самое но с джойнами. В случае предложенного запроса то точно не проще, и уж тем более не оптимальнее, т.к. вложенные запросы выполняются гораздо медленнее. Кстати, не уверен в правильности предложенного варианта. Лучше использовать следующую альтернативу: Код:
И дополнительное связывание (джойны) вовсе не к чему, только занимать дополнительные ресурсы.... Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: Alex03 от Январь 08, 2007, 19:48 Цитата: "Steven_Orko" Цитата: "Alex03" SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man; Ну или тоже самое но с джойнами. В случае предложенного запроса то точно не проще, и уж тем более не оптимальнее, т.к. вложенные запросы выполняются гораздо медленнее. Кстати, не уверен в правильности предложенного варианта. Зависит от используемой БД и кол-ва записей в таблицах (и прочих особенностей сервера) Приведённый мною вариант запроса порой очень выгоден тем что внутренний запрос выполняется во время фетча записи, поэтому если основной запрос возвращает много записей а фетчится из них далеко не всё, или если первые записи результата нужны как можно быстрей то ... Цитировать Лучше использовать следующую альтернативу: Код:
И дополнительное связывание (джойны) вовсе не к чему, только занимать дополнительные ресурсы.... Ваш вариант есть не что иное как неявный джойн, который вполне корректен (и логичен) для приведённого примера пока не появились другие таблицы, условия, или столбцы с нулевыми значениями (как то man.id_city). Впрочем всё это уже не по теме. Название: Связь между таблицами БД (QSqlRelationalTableModel) Отправлено: Admin от Январь 09, 2007, 17:26 насчет вложенных запросов - они не везде работают!
например sqllite и mysql4 - там с эти трудновато! |