![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не могу соединить таблицы запросом [D7, IB6.x]
fedor © (2005-07-11 00:59:00)Две таблицы r и к. IBDataset. Соединяю следующим образом: select * from k where id=:id; в свойствах датасета для к DataSource:DataSource_таблицы_r. Все работает отлично, только при большом количестве записей тормозит.
Решил изменить запрос на следующий:
select k. * from k, r where (k.id=r.id) order by kdate.
Не соединяет. Показывает тупо все записи. Почему?
fedor (2005-07-11 19:47:00) [1]Всем спасибо. Обычно посылают с таким вопросом :),а тут все конструктивно. Сразу видно- форум профессионалов.
dolmat (2005-07-11 15:35:00) [2]Да я действительно немного невнимательно прочитал.
Скорость добавят только индексы и оставить все как было в >вопросеДве таблицы r и к. IBDataset. Соединяю следующим образом: select * from k where id=:id; в свойствах датасета для к DataSource:DataSource_таблицы_r. Все работает отлично, только при большом количестве записей тормозит.
Deniz (2005-07-11 15:21:00) [3]>dolmat
Кому нужно?
inner join и select k. * from k, r where k.id=r.id практически один и тот же запрос, а он автора не устраивает. Автору нужен мастер-деталь. [7] и [8] попытались объяснить что к чему.
evvcom (2005-07-11 15:17:00) [4]
> dolmat (11.07.05 15:09) [9]
да не это ему нужно, что ты никак не поймешь?
dolmat (2005-07-11 15:09:00) [5]>Deniz © (11.07.05 14:01) [7]
Не нравится left join r r on (k.id=r.id)
замени на inner join r r on (k.id=r.id)
и будет как нужно
Val (2005-07-11 14:14:00) [6]>fedor (11.07.05 00:59)
Ваш новый запрос показывает все записи таблицы , потому что в таблице r есть все id, которые встречаются в k.
Вам же нужен, насколько я понимаю, запрос, который возвратит все записи из k, у которых id = id текущей записи из r. Это мастер-дитейл связь. Реализуется она либо так как у вас было раньше, либо обработкой событий перехода от записи к записи в r и переоткрытии к с передачей ему r.id в виде параметра.
А тормоза, скорее всего, просто из-за отсутствия индекса.
Deniz (2005-07-11 14:01:00) [7]>dolmat
Не надо путать человека.
Запрос выдаст все записи из k независимо от того есть ли соответствие по id в r.
>fedor
Тут вариант такой:
при перемещении указателя с записи на запись, компоненты посылают запрос на сервер вида select * from k where id=1(берется автоматически из текущей записи). И если ты хочешь пролистать несколько записей либо жди выполнения каждого запроса, либо реализуй самостоятельно задержку перед выполнением запроса, и если юзер не перескачил на другую запись, то выполняй запрос, либо используй FIBPlus, где все это и еще много чего раелизовано.
dolmat (2005-07-11 09:17:00) [8]select k..naim1, k.naim2, r.naim1, r.naim1 from k k
left join r r on (k.id=r.id)
order by kdate.
Anatoly Podgoretsky (2005-07-11 09:12:00) [9]Соединением и не пахнет.
fedor (2005-07-11 06:23:00) [10]Deniz, я ж про то и говорю, но в книге, причем уважаемой, такой запрос как основной пример и других вариантов нет. А увидеть я хочу все записи из таблы k, чьи id соответствуют выбранной записи из таблы r.
Deniz (2005-07-11 06:13:00) [11]>fedor
>Не соединяет.
Что значит не соединяет?
>Показывает тупо все записи.
А что ты хочешь увидить?
Твой запрос и должен показать ВСЕ записи.
fedor (2005-07-11 06:09:00) [12]Да в других книгах не меньше, но там точно такой же запрос в примере и про join ни слова. Ты мне лучше скажи, прожалуйста, где в запросе ошибка.
dmitry501 (2005-07-11 05:23:00) [13]fedor (11.07.05 0:59)
Что бы не тормозило, оптимизировать индексы (читать ibase.ru)
Так же не помешает в учебнике по SQL почитать про JOIN