Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на обновление: замена заданного числа на соседнее по условию / 23 сообщений из 23, страница 1 из 1
13.09.2004, 15:33:02
    #32692120
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CO	Extension	Transfer	Number
 12 	 104 				 83252222222 
 12 	 369 		*		 83252222222 
 6 	 108 				 83259999999 
 8 	 104 				 83001234567 
 22 	 116 				 83007654321 
 6 	 369 		*		 83259999999 
 15 	 137 				 09 
 22 	 369 		*		 83009876543 
 19 	 137 				 09 
Как видно, это логи АТС
Около Extension: 369 всегда стоит звездочка — подтверждает, что это "трансфер звонка".

Задача: 369 поменять на номер Extension, у которого совпадает CO и Number, причем он должен быть
а) выше по списку
б) первый совпавший

То есть в примере надо заменить 369 во второй строке на 104, в шестой строке на 108, а в восьмой — не менять вовсе.

Возможно ли это сделать одним запросом? Естественно, хочется избежать функций типа Iif, чтобы ускорить процесс.

Платформа — Acc'XP.
...
Рейтинг: 0 / 0
13.09.2004, 15:46:20
    #32692153
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Как всегда - в таких задачах мой первый вопрос

Как определяется порядок строк (упорядочивающий критерий есть?)

Т.е. в вашем примере первая строка не отличается от второй (пардон) ни чем
Как Акс должен определить какая строка "выше"
Сразу предупрежу ваш ответ - типа: порядок строк определяется порядком их появления в таблице (дык - это не есть правильный ответ, ибо мы этим воспользоваться не можем, впрочем так же как и Акс)
Вам надо либо упорядоченный счетчик иметь или дату, по которым и будем определять, что выше :)
...
Рейтинг: 0 / 0
13.09.2004, 16:11:54
    #32692226
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
порядок строк определяется порядком их появления в таблице — я так и не собирался говорить

Скажем так — в процессе конвертации данных из текстового файла добавлю к ней поле Counter.
Хотя, когда пример писал, имел в виду сортировку по полю iDate (datetime) — но почему-то не включил в пример. бес попутал...
Да собсно, все равно. Будем считать что поле для однозначной сортировеки есть, пусть будет Counter
...
Рейтинг: 0 / 0
13.09.2004, 16:16:39
    #32692239
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Т.е. в результате должно быть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CO	Extension	Transfer	Number
 12 	 104 				 83252222222 
 12 	 104 		*		 83252222222 
 6 	 108 				 83259999999 
 8 	 104 				 83001234567 
 22 	 116 				 83007654321 
 6 	 108 		*		 83259999999 
 15 	 137 				 09 
 22 	ххх		*		nnnnnnnnnnn
 19 	 137 				 09 
?
...
Рейтинг: 0 / 0
13.09.2004, 16:22:41
    #32692256
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
нет, должно остаться без изменений
Код: plaintext
1.
 22 	 369 		*		 83009876543 
...
Рейтинг: 0 / 0
13.09.2004, 16:27:56
    #32692270
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
SELECT ...
FROM tabl t1 LEFT JOIN tabk t2 ON t1.CO=t2.Co AND t2.Transfer IS NULL AND t1.Transfer="*"
...
Рейтинг: 0 / 0
13.09.2004, 16:32:38
    #32692284
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
update t inner join t AS t1 on (t.number = t1.Number) AND (t.CO = t1.CO) AND (t.Extension <> t1.Extension)
set t.Extension = t1.Extension
where t.Transfer="*";

Только тут я беру первый попавшийся, а не первый по списку. А обязательно первый по списку? ;))
...
Рейтинг: 0 / 0
13.09.2004, 16:35:57
    #32692294
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
VictoshaSELECT ...
FROM tabl t1 LEFT JOIN tabk t2 ON t1.CO=t2.Co AND t2.Transfer IS NULL AND t1.Transfer="*"
1) это было без условия на номер.
2) Выше по списку - надо бы "нумеровать" чем-то
в итоге что надо - выборка или update исходной таблицы?
...
Рейтинг: 0 / 0
13.09.2004, 16:36:13
    #32692296
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
обязательно... на этом и загвоздка...
...
Рейтинг: 0 / 0
13.09.2004, 16:37:57
    #32692299
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
авторВыше по списку - надо бы "нумеровать" чем-то
Добавили же поле Counter? чтоб по нему сортировать.
Нужен именно Update
...
Рейтинг: 0 / 0
13.09.2004, 16:43:58
    #32692317
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
может быть?

Geoupdate t inner join t AS t1 on (t.number = t1.Number) AND (t.CO = t1.CO) AND t1.counter IN (Select MIN(counter) From t as t3 WHERE
(t3.number = t1.Number) AND (t3.CO = t1.CO) AND AND t3.Transfer IS NULL
AND (t.Extension <> t1.Extension)

)

set t.Extension = t1.Extension
where t.Transfer="*";

<///>;))
...
Рейтинг: 0 / 0
13.09.2004, 16:48:49
    #32692335
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Cо вложенными он ругается на "обновляемый запрос". Не могу обойти. На ум приходит только двойной dlookup но это совсем плохо. М.б. все-таки какая-нибудь временная таблица?..
...
Рейтинг: 0 / 0
13.09.2004, 17:00:34
    #32692366
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
у тебя ругается, а у меня вообще вылетает с приветом Биллу...
сервиспаки стоят.

Да и потом, есть у меня ощущения, что запрос поменяет все "трансфер=*" на первый найденный правильный екстеншн. Или нет?
...
Рейтинг: 0 / 0
13.09.2004, 17:11:32
    #32692403
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Да нет, зачем же... Сейчас dmin/dlookup попробую, но, имхо, лучше посредством доп. таблицы/записей.
...
Рейтинг: 0 / 0
13.09.2004, 17:14:47
    #32692414
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Ладно, тогда буду дополнительные таблицы ваять.
Спасибо всем откликнувшимся!
...
Рейтинг: 0 / 0
13.09.2004, 17:16:53
    #32692422
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Погоди, вот:

UPDATE t, t as t1
SET t.Extension = t1.extension

WHERE
t.Transfer="*" AND
t1.cntr=nz(DMin("cntr","t","co=" & t.CO & " and len(nz(Transfer))=0 and number='" & t.number & "'"),0);
...
Рейтинг: 0 / 0
13.09.2004, 17:19:34
    #32692433
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
, где cntr - счетчик, а number - текстовое поле
...
Рейтинг: 0 / 0
15.10.2004, 13:10:44
    #32740322
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
маленький ап

как можно это еще и убыстрить?

дело в том, что я человек, так сказать, измученный нарзаном.
Устал ждать

на ~100 записей — ~ 3 секунд
на ~8000 записей (смешно сказать) — не знаю сколько секунд, ни разу не смог дождаться...


что такое индексы, я не знаю, но предполагаю, что надо сделать какие-то поля индексированными. Так ли это? и если да, то какие?

В данный момент индексированы поля Код (cntr в примере Geo), Extension, transfer и number


Кстати, действует ли индексированность на скорость работы DMin?
...
Рейтинг: 0 / 0
15.10.2004, 16:05:35
    #32740797
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
А можешь на мыло прислать мне тестовую табличку записей на 1000-5000?
...
Рейтинг: 0 / 0
15.10.2004, 16:42:12
    #32740909
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Конечно, только в понедельник — в Астане рабочий день закончился.
Спасибо заранее.

Кстати, оставляю запрос выполняться на сервере, на все выходные.




//Знали бы вы, какой каторжный труд делать это все вручную!
//Нуф-style comment ©Непомнючьё
...
Рейтинг: 0 / 0
15.10.2004, 17:59:51
    #32741076
htrjhlctnjv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Попробуй обрезать количество записей в произведении (до WHERE):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
UPDATE t INNER JOIN t AS t1
ON
   (t1.cntr)<[t].[cntr] 
 AND
    ((t1.Transfer) Is Null Or (t1.Transfer)= '')   
 AND
  (t.Transfer)= '*' 

 SET t.Extension = t1.extension
 
WHERE 
(t1.cntr)=nz(DMin('cntr','t',"co=" & [t].[CO] & " and ((t.Transfer Is Null) Or (t.Transfer='') ) and [number]='" & [t].[number] & " ' "), 0 )
не утверждаю, что поможет. (предпочитаю такие задачи в Аксесе решать в рекордсете - нормальный SQL он тут не понимает - а то было бы так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
UPDATE t  
SET 
t.extension = (
SELECT TOP  1  t1.extension
 FROM  t AS t1
 WHERE
   (t1.cntr)<t.cntr 
 AND
    ((t1.Transfer) Is Null Or (t1.Transfer)= '')   
 ORDER BY cntr DESC
) 
WHERE (((t.Transfer)= '*')); 
...
Рейтинг: 0 / 0
16.10.2004, 17:00:34
    #32741545
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Надо было сразу временными таблицами делать.
Cделал временную таблицу tt (mId long, CO int, number text).
Первичный ключ - СО + number.

Сделал тестовую таблицу на 10000 записей. Запрос с DMIN умер.
Вместо него вызываются три других:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 ' 1) 
On Error Resume Next
currentdb.execute "delete * from tt"
On Error GoTo  0 
 ' 2) 
currentdb.execute "query1"
 ' 3) 
currentdb.execute "query2"
У меня отработало мгновенно.
Можно немного по-другому, чтоб тестовая таблица не болталась в списке:
Код: plaintext
1.
2.
3.
4.
5.
6.
 ' 1) 
currentdb.execute "query1-1"
 ' 2) 
currentdb.execute "query2"
 ' 3) 
currentdb.tabledefs.delete "tt"

Query1:
Код: plaintext
1.
2.
3.
4.
5.
6.
insert		into tt (mId, CO, [number])
select		Min(t.id), t.CO, t.number
from		tCalls as t
		INNER JOIN tCalls AS t1 ON (t.CO = t1.CO) 
		                           AND (t.number = t1.number)
where		t1.transfer = '*' and (t.transfer='' or t.transfer is null)
group by 	t.CO, t.number

Query2:
Код: plaintext
1.
2.
3.
4.
UPDATE	(tCalls as t 
	 INNER JOIN tCalls AS t1 ON (t.CO = t1.CO) AND (t.number = t1.number))
	 INNER JOIN tt ON t1.id = tt.mId
SET	t.transfer = "", t.ext = t1.ext
WHERE   t.transfer='*'

Query1-1:
Код: plaintext
1.
2.
3.
4.
5.
6.
select		Min(t.id), t.CO, t.number
Into		tt
from		tCalls as t
		INNER JOIN tCalls AS t1 ON (t.CO = t1.CO) 
		                           AND (t.number = t1.number)
where		t1.transfer = '*' and (t.transfer='' or t.transfer is null)
group by 	t.CO, t.number
...
Рейтинг: 0 / 0
18.10.2004, 16:44:06
    #32743056
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на обновление: замена заданного числа на соседнее по условию
Geo!
Буду в Москве, с меня пиво.

//еще раз убедился в том, что форум мне вреден. Мог сам додуматься, но заломало.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на обновление: замена заданного числа на соседнее по условию / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]