Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите создать запрос на обновление / 12 сообщений из 12, страница 1 из 1
06.07.2004, 13:18:09
    #32591234
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
Условия: даны две таблицы
t1 c полями f1 и f2
Код: plaintext
1.
2.
3.
4.
5.
f1	f2
1	0
2	0
3	0
4	0
5	0
и t2 c полями f1 и f2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
f1	f2
1	22
1	33
2	44
2	44
3	66
4	77
4	77
4	99
Таблицы связаны по полю f1.
Необходимо в таблице t1 обновить поле f2, с условием, что в него попадают только те значения из t2!f2, число возможных значений которых равно 1. т.е. в резульрате необходимо получить:
Код: plaintext
1.
2.
3.
4.
5.
f1	f2
1	0
2	44
3	66
4	0
5	0
Сделать это надо без использования промежуточных таблиц запросов т.е. одним запросом на обновление
...
Рейтинг: 0 / 0
06.07.2004, 13:22:58
    #32591242
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
Код: plaintext
1.
2.
update tbl1 inner join tbl2 on tbl1.f1 = tbl2.f1
set tbl1.f2 = tbl2.f2
Where tbl1.f1 in (select f1 from tbl2 group by f1 having count( 1 )= 1 )
?
...
Рейтинг: 0 / 0
06.07.2004, 13:37:37
    #32591289
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
если я правильно понял
Код: plaintext
count( 1 )= 1 )
=
Код: plaintext
count(f1)= 1 )
то это не работает
Код: plaintext
1.
2.
3.
4.
5.
f1	f2
1	0
2	0
3	66
4	0
5	0
...
Рейтинг: 0 / 0
06.07.2004, 13:51:12
    #32591323
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
marvanесли я правильно понял
Код: plaintext
count( 1 )= 1 )
=
Код: plaintext
count(f1)= 1 )
ПОфиг - если честно :)

marvanто это не работает
Код: plaintext
1.
2.
3.
4.
5.
f1	f2
1	0
2	0
3	66
4	0
5	0

Я просто не уловил суть вопроса
Мне показалось, что надо обновлять только те поля, у которых не одинаковые значения, а у которых всего одно вхождение в таблицу 2 с f1

тогда так: (идея Rivkin Dmitry - max = min )
Код: plaintext
1.
2.
3.
4.
5.
update tbl1 inner join tbl2 on tbl1.f1 = tbl2.f1
set tbl1.f2 = tbl2.f2
Where tbl1.f1 in
 (select f1 from tbl2 as tt2
 where (select min(f2) from tbl2 where f1 = tt2.f1)
 = (select max(f2) from tbl2 where f1 = tt2.f1))

или так - моя, только подправленная
Код: plaintext
1.
2.
3.
4.
update tbl1 inner join tbl2 on tbl1.f1 = tbl2.f1
set tbl1.f2 = tbl2.f2
Where tbl1.f1 in
 (select f1 from [select distinct f1, f2 from tbl2]. as tt2
 group by f1 having count( 1 )= 1 )
...
Рейтинг: 0 / 0
06.07.2004, 14:06:19
    #32591367
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
Спасибо за совет, всё работает, как надо. Последняя реализация выглядит симпотично, у меня б духу не хватило сделать тройной вложенный запрос.
...
Рейтинг: 0 / 0
06.07.2004, 14:18:06
    #32591398
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
marvanСпасибо за совет, всё работает, как надо. Последняя реализация выглядит симпотично, у меня б духу не хватило сделать тройной вложенный запрос.
Дык - они обе с ДВУМЯ вложениями, только в первом случае подзапросов 3, а во втором всего 2 :)
...
Рейтинг: 0 / 0
06.07.2004, 14:26:53
    #32591428
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
Видимо это всё и испортило... :-)
Тормозной он до крайности (5мин прошло, а на полосе выполнения одно деление), видимо придётся делать через временную таблицу.
...
Рейтинг: 0 / 0
06.07.2004, 14:27:36
    #32591431
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
авторили так - моя, только подправленная
update tbl1 inner join tbl2 on tbl1.f1 = tbl2.f1
set tbl1.f2 = tbl2.f2
Where tbl1.f1 in
(select f1 from [select distinct f1, f2 from tbl2]. as tt2
group by f1 having count(1)=1)


А вот сейчас действительно твоя идея ,только подправленная :)
Код: plaintext
1.
2.
3.
4.
update tbl1 inner join tbl2 on tbl1.f1 = tbl2.f1
set tbl1.f2 = tbl2.f2
Where tbl1.f1 in
 (select f1 from tbl2 as tt2
 group by f1 having min(f2)=max(f2))
...
Рейтинг: 0 / 0
06.07.2004, 14:46:48
    #32591486
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
2 (c)VIG
спасибо, последняя версия запроса работает достаточно быстро. Буду использовать её.
...
Рейтинг: 0 / 0
06.07.2004, 15:22:15
    #32591597
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
авторА вот сейчас действительно твоя идея ,только подправленная :)
Нда - так красивее :)
Был бы MSSQL, можно было бы еще и от in избавиться (ибо ему пофиг на необновляемость подзапросов :) )
ИМХО - Акс с in, ваще, не очень шустро работает :(
...
Рейтинг: 0 / 0
06.07.2004, 15:44:35
    #32591671
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
Двое пожилых одесситов проезжают в трамвае место ,где до революции располагался публичный дом. Один из них тяжело вздыхает
Второй: "И он еще мне будет рассказывать..."
...
Рейтинг: 0 / 0
06.07.2004, 16:10:43
    #32591759
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите создать запрос на обновление
Супер :)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите создать запрос на обновление / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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