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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать какой таблице принадлежит поле  (Прочитано 5407 раз)
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, принадлежит каждый филд ?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Январь 28, 2014, 11:31 »

А что, алиасы уже запретили?
Код
SQL
SELECT t1.name AS t1_name, t2.name AS t2_name ...
Записан
Serr500
Гость
« Ответ #2 : Январь 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'ом.
Записан
kandrey
Гость
« Ответ #3 : Январь 28, 2014, 11:44 »

В процессе работы программы значения полей меняются и надо сформировать UPDATE,.. я знаю что обновляемая таблица - t1, но не могу различить какой таблице принадлежат поля,...алиасы в UPDATE я тоже не могу передать
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #4 : Январь 28, 2014, 12:23 »

А их и не надо передавать. Программа должна знать, что если изменилось поле t2_name, то и апдейтить надо таблицу t2.
Записан
kandrey
Гость
« Ответ #5 : Январь 28, 2014, 12:31 »

Откуда же она узнает, она и понятия не имеет какие там будут запросы,..ей надо только пройти по списку филдов, и если они поменялись то затолкать их в UPDATE, но она должна знать какой филд принадлежит t1 а какой нет
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #6 : Январь 28, 2014, 12:37 »

Что значит не будет знать? Если текст запроса пишется в коде программы, то программист уже знает все запросы. Если же вся бизнес-логика реализована на стороне сервера, то и обновлять надо на стороне сервера, а не в программном коде. В любом случае, надо пересматривать подход, так как запросы такого типа нормальные сервера БД не признают за обновляемые.
Записан
kandrey
Гость
« Ответ #7 : Январь 28, 2014, 12:42 »

SELECT пишет программист (или пользователь),..по селекту формируется TableView (через model/view) а UPDATE формируется автоматом,..не писать же на каждый select свой update
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Январь 28, 2014, 13:08 »

Вот пусть каждый и пишет свой апдейт на свой селект. Для программ с фиксированной логикой - программист, а если это что-то типа интерпретатора SQL - пусть пользователь и обновляет свои запросы.
Записан
kandrey
Гость
« Ответ #9 : Январь 28, 2014, 13:12 »

это да,...это конечно можно,... только не удобно.

Вопрос остается открытым.
Записан
Serr500
Гость
« Ответ #10 : Январь 28, 2014, 15:44 »

То, что Вы хотите сделать невозможно. Единственный вариант - перехватывать SQL-запрос пользователя и парсить его самостоятельно.
Записан
ploop
Гость
« Ответ #11 : Январь 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)? А если там пользователь такой трёхэтажный запрос навертит, что плохо станет, не думали? Улыбающийся

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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