Russian Qt Forum

Qt => Базы данных => Тема начата: kandrey от Январь 28, 2014, 11:01



Название: Как узнать какой таблице принадлежит поле
Отправлено: kandrey от Январь 28, 2014, 11:01
Есть запрос вида

select t1.name, t2.name from t1 left join t2 on t1.t2_id = t2.id

После выполнения запроса QSqlRecord будет хранить список QSqlField-ов с одинаковыми именами "name"

Как узнать какой таблице, t1 или t2, принадлежит каждый филд ?


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: Hellraiser от Январь 28, 2014, 11:31
А что, алиасы уже запретили?
Код
SQL
SELECT t1.name AS t1_name, t2.name AS t2_name ...


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: Serr500 от Январь 28, 2014, 11:32
1) По индексу. Используем QSqlField QSqlRecord::field(int index) const. t1.name будет иметь меньший индекс, чем t2.name.
2) Задача изначально поставлена неправильно. Если выбираются поля с разными именами, надо использовать псевдонимы:
Код:
select t1.name as name_t1, t2.name as name_t2 from t1 left join t2 on t1.t2_id = t2.id;
3) Филд уже не принадлежит ни t1, ни t2.  ;) Он принадлежит новой таблице, сгененрированной SELECT'ом.


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: kandrey от Январь 28, 2014, 11:44
В процессе работы программы значения полей меняются и надо сформировать UPDATE,.. я знаю что обновляемая таблица - t1, но не могу различить какой таблице принадлежат поля,...алиасы в UPDATE я тоже не могу передать


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: Hellraiser от Январь 28, 2014, 12:23
А их и не надо передавать. Программа должна знать, что если изменилось поле t2_name, то и апдейтить надо таблицу t2.


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: kandrey от Январь 28, 2014, 12:31
Откуда же она узнает, она и понятия не имеет какие там будут запросы,..ей надо только пройти по списку филдов, и если они поменялись то затолкать их в UPDATE, но она должна знать какой филд принадлежит t1 а какой нет


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: Hellraiser от Январь 28, 2014, 12:37
Что значит не будет знать? Если текст запроса пишется в коде программы, то программист уже знает все запросы. Если же вся бизнес-логика реализована на стороне сервера, то и обновлять надо на стороне сервера, а не в программном коде. В любом случае, надо пересматривать подход, так как запросы такого типа нормальные сервера БД не признают за обновляемые.


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: kandrey от Январь 28, 2014, 12:42
SELECT пишет программист (или пользователь),..по селекту формируется TableView (через model/view) а UPDATE формируется автоматом,..не писать же на каждый select свой update


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: Hellraiser от Январь 28, 2014, 13:08
Вот пусть каждый и пишет свой апдейт на свой селект. Для программ с фиксированной логикой - программист, а если это что-то типа интерпретатора SQL - пусть пользователь и обновляет свои запросы.


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: kandrey от Январь 28, 2014, 13:12
это да,...это конечно можно,... только не удобно.

Вопрос остается открытым.


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: Serr500 от Январь 28, 2014, 15:44
То, что Вы хотите сделать невозможно. Единственный вариант - перехватывать SQL-запрос пользователя и парсить его самостоятельно.


Название: Re: Как узнать какой таблице принадлежит поле
Отправлено: ploop от Январь 28, 2014, 23:16
SELECT пишет программист (или пользователь),..по селекту формируется TableView (через model/view) а UPDATE формируется автоматом,..не писать же на каждый select свой update

Что-то типа SQL-консоли? То есть, у вас запрос: select t1.name, t2.name from t1 left join t2 on t1.t2_id = t2.id и вы хотите сделать update t2 set name = ..., даже с учётом того, что такой записи, возможно, в t2 не существует (left join)? А если там пользователь такой трёхэтажный запрос навертит, что плохо станет, не думали? :)