C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Возможности SQL
Oper01
Отправлено: 05.02.2007, 09:23


Станционный диспетчер

Группа: Участник
Сообщений: 145



Здравствуйте.
Работаю с Access через ADO.

Есть 2 таблицы t1 и t2. В одной порядка 50000 (t1) записей, в другой пока около 15000 (t2).
Необходимо получить следующее: посчитать сколько раз встречается значение поля t1->FieldByNamr("rn1") (текстовое поле) в t2->FieldByNamr("rn2") (текстовое поле). Если сделать количество SQL запросов равное числу записей t1, то получим результат (для каждого значения поля [rn1] таблицы t1 делаем запрос в t2). Такая операция по времени занимает порядка 7-10 минут.
Как можно оптимизировать такую задачу по времени? Возможно ли это сделать с помощью одного запроса?
Спасибо.
AVC
Отправлено: 05.02.2007, 09:56


Ветеран

Группа: Модератор
Сообщений: 1583



Например так
Select t1.rn1, Count(*) From t1, t2
Where t2.rn2 = t1.rn1
Group By t1.rn1
Подгонка под синтаксис Access'а за вами smile.gif
nawok78
Отправлено: 05.02.2007, 10:49


Станционный диспетчер

Группа: Участник
Сообщений: 115



ну вот не успел sad.gif
Oper01
Отправлено: 06.02.2007, 10:09


Станционный диспетчер

Группа: Участник
Сообщений: 145



Спасибо за помощь. Я буду пробовать.
Может ещё задам вопросы
smile.gif
Oper01
Отправлено: 06.02.2007, 10:38


Станционный диспетчер

Группа: Участник
Сообщений: 145



Работает замечательно. Access вполне устроил такой запрос, даже не пикнул.
Но вотвопрос такой: а как этот результат сохранить. Т.е. как получить значение поля, где количество встречаемых значений. Какое у него имя? Как к нему обратиться?
AVC
Отправлено: 06.02.2007, 10:50


Ветеран

Группа: Модератор
Сообщений: 1583



Можно по индексу (номеру)
или
присвоить имя (предпочтительно)
Select t1.rn1, Count(*) as cnt
From t1, t2
Where t2.rn2 = t1.rn1
Group By t1.rn1
Oper01
Отправлено: 06.02.2007, 11:41


Станционный диспетчер

Группа: Участник
Сообщений: 145



Спасибо. Всё работает как и хотелось и главное время выполнения запроса какое! smile.gif
Oper01
Отправлено: 06.02.2007, 12:55


Станционный диспетчер

Группа: Участник
Сообщений: 145



И последний вопрос. Было бы неплохо ещё и так:
в результате запроса полачаем два поля: rn1, cnt.
Можно добавить в это же запрос инструкцию или как-то его изменить, чтобы в таблицу t1 в поле например cnt1 записалось значение cnt (естественно при условии t1.rn1=t2.rn2)?
AVC
Отправлено: 06.02.2007, 13:55


Ветеран

Группа: Модератор
Сообщений: 1583



Должно бы так
Update t1 Set t1.cnt1 = (Select Count(*) From t2 Where t2.rn2 = t1.rn1);

или так

Update t1
inner join
(Select t11.rn1, Count(*) as cnt From t1 t11, t2
Where t2.rn2 = t11.rn1
Group By t11. rn1
) t3 on (t3.rn1 = t1.rn1)
SET t1.cnt1 = t3.cnt;

но не работает в Accesse.

А вообще это вредная привычка хранить вычисляемую информацию. Её нужно получать от сервера в тот момент когда она нужна.
Oper01
Отправлено: 06.02.2007, 14:24


Станционный диспетчер

Группа: Участник
Сообщений: 145



Спасибо за помощь!

Вернуться в Работа с базами данных в C++Builder