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'а за вами |
|
nawok78 |
Отправлено: 05.02.2007, 10:49 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
ну вот не успел
|
|
Oper01 |
Отправлено: 06.02.2007, 10:09 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 145
|
Спасибо за помощь. Я буду пробовать.
Может ещё задам вопросы
|
|
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
|
Спасибо. Всё работает как и хотелось и главное время выполнения запроса какое! |
|
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
|
Спасибо за помощь! |
|