![]() |
|
Модераторы: Akella |
![]()
|
|
| Гость_sland |
|
||||
|
Unregistered |
Привет народу!
Имеется запрос:
Попытался его оптимизировать (предыдущий запрос выполняется 40 сек, а следующий-всего 10-15сек):
Почему они выдают разные результаты? Может кто видит логическую ошибку? Человеческим языком запрос звучит так: Найти сумму платежей и число людей, их заплативших, за определенный период, причем интересуют только люди из определенной организации. Информация о людях и организациях, в которых они работают-в таблице Customer, а информация о платежах c кодами людей, их вносивших-в таблице Entering_Info. |
||||
|
|||||
| SPrograMMer |
|
||||||||||||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: нет Всего: 6 |
РАЗ:
пишется проще:
ДВА: первый запрос имеет подзапрос, который возвращает ДИАПАЗОН НУЖНЫХ тебе значений, которые затем используются в
Второй же запрос, объединяя две таблицы производит РЕЛЯЦИОННОЕ УМНОЖЕНИЕ строк первой и второй таблиц, что соответственно производит к некоторому дублированию информации, и вроде бы одно и то же условие теперь выбирает абсоютно другие данные. Да и есчо, наверное ТРИ, вот это самое
Делать вовсе ненужно, у тебя в "главном" запросе всего одна таблица, поэтому, ненужно. Как это дело все же оптимитизировать? счась подумаю может чего и скажу................... -------------------- животное = зверь законченный гентушник |
||||||||||||
|
|||||||||||||
| Гость_sland |
|
|||
|
Unregistered |
Спасибо, что откликнулся, почтенный SPrograMMer!
1. Between мне не подходит, т.к., если я не ошибаюсь, он выдает значения в диапазоне >=...<=, а мне необходимо >=...<. Можно, конечно, перед составлением запроса уменьшат дату на 1, но это не очень удобно. 2. Помоги, пожалуйста, правильно составить. Выражение IN очень медленное и заставляет перебирать по нескольку раз очень большую таблицу. 3. Замечание, видимо, касается введения обозначения Е. Сделал для надежности. Как все-таки правильно построить запрос? Подскажите, пожалуйста. |
|||
|
||||
| Гость_sland |
|
|||
|
Unregistered |
Прошу прощения у всех участников форума!
Нашел ошибку: поле Entering_Sum, оказывается, есть в обоих таблицах и первый запрос считает из таблицы Entering_Info (естесственно), а второй - из Customer. В Entering_info это поле означает величину конкретного платежа, а в Customer - сумму последнего платежа. Еще раз прошу прощения. |
|||
|
||||
| Гость_Владимир |
|
|||
|
Unregistered |
Самый удобный метод. Создаются рабочие таблицы, куда пишутся времЕнные данные. Для многопльзовательской работы добавляется ключевое поле с уникальным значением, полученным от генератора( можно использовать 1 рабочий на всякую повседневность) Туда выбираются C.Id_People с нужным organization. И выбираются с допусловием WHERE .... AND EXIST(SELECT FOM TEMP t WHERE
T.TEMPKEY=:TEMPKEY AND T.Id_People=E.Id_People) на ibase.ru есть статьи Попова насчет запросов с WHERE ... IN(...) |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
||||
|
||||
![]()
|
| Правила форума "Interbase" | |
|
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |