Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как обновить поле с наименьшим значением другого поля в группе записей / 16 сообщений из 16, страница 1 из 1
18.07.2003, 12:45
    #32211997
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Есть таблица с 4-мя полями: Dt,KodP,Summa2,Summa
Нужно для всех групп по KodP заменить поле Summa c наименьшим значением в группе поля Dt на значение поля Summa2 .
Можно ли и как это сделать одним запросом ?
...
Рейтинг: 0 / 0
18.07.2003, 15:50
    #32212317
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Так что - никто не знает, или никто не понял ?..
...
Рейтинг: 0 / 0
18.07.2003, 15:51
    #32212318
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Нельзя
...
Рейтинг: 0 / 0
18.07.2003, 17:32
    #32212463
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Если "для всех групп по KodP", то что такое "в группе поля Dt"?
...
Рейтинг: 0 / 0
18.07.2003, 17:37
    #32212470
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Саныч, совершенно неважно что это такое.
Как только видишь слова "Группы", "Сумма", "Наименьшее значение" и т.п. - так сразу и понимаешь что запрос группировочный. Даже выборку запихнуть в один запрос, то обновляемым это запрос сделать не получится (в аксесе).
Так что на вопрос "Можно ли это сделать одним запросом" ответ "Нельзя"
...
Рейтинг: 0 / 0
18.07.2003, 17:41
    #32212477
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Лох, я понял. Ты поймал один признак, по которому НЕТ, и сделал вывод, что весь ответ НЕТ. Я тоже так поступил, только я поймал признак, по которому ДА: я вижу, что автор что-то сформулировал не так. Это дает надежду, что ему вообще нужно не то, что мы читаем в его вопросе.
...
Рейтинг: 0 / 0
18.07.2003, 17:44
    #32212481
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Ааа, ну если автор сформулировал не так - тогда конечно же ответ:
ДА!
Разумеется можно! Даже очень просто! Как только поймем - что, так сразу и сделаем!
...
Рейтинг: 0 / 0
18.07.2003, 23:43
    #32212705
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Я, извиняюсь, уже свалил с работы в это время, отвечаю из дома:
Правда, не совсем понятно, что ,собстно, не понятно , могу только то - же другими словами :

В таблице есть группы записей с одинаковым значением поля KodP, а поле Dt в кажой такой группе имеет разные значения ( и конечно , какое-то из них будет наименьшее ). Ну, вот , и надо в таких записях (где находятся эти наименьшие значения поля Dt - в каждой группе такая запись у меня единственная ) в поле Summa заменить значение на значение поля Summa2 ...
...
Рейтинг: 0 / 0
19.07.2003, 00:07
    #32212711
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Это я извиняюсь. :^)

Я был не прав. Автор все сформулировал нормально, а я читал не так. И тогда прав Лох - одним запросом ничего не получится. Значит, надо программой. Например, так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
With CurrentDb.OpenRecordset( _
             "SELECT KodP, Min(Dt) AS MinOfDt FROM A GROUP BY KodP" , _
            dbOpenDynaset, dbReadOnly)
    Do Until .EOF
        CurrentDb.Execute _
             "UPDATE A SET Summa = Summa2 WHERE KodP="  _
            & Str(!KodP) &  " AND Dt="  & Str(!MinOfDt)
        .MoveNext
    Loop
    .Close
End With


При этом если эти поля не числовые, то в тех местах, где я написал Str, надо писать по-другому (где-то на этом форуме это есть - как вставлять разные константы в SQL).
...
Рейтинг: 0 / 0
19.07.2003, 00:41
    #32212718
am (a_mitin)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Все извиняются, тогда я тоже извинюсь... что попробую поспорить с авторитетным мнением завсегдатаев... ;)

Вот запросец, чуток название полей изменил, но надеюсь понятно будет:

UPDATE Таблица1 AS t1 SET t1.Sum1 = [t1].[Sum2]
WHERE (((t1.Dt) In (SELECT Min(t2.Dt) AS [Min-Dt]
FROM Таблица1 t2 WHERE t2.Kod = t1.Kod)))
...
Рейтинг: 0 / 0
19.07.2003, 01:05
    #32212723
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Да уж, был неправ. Слово "сумма" смутило разум.
Позор на мою лохматую голову.
З.Ы. Извинений не дождетесь
...
Рейтинг: 0 / 0
19.07.2003, 01:17
    #32212726
VIG
VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Можно и мне внести свою скромную лепту
Код: plaintext
1.
2.
3.
4.
UPDATE myTable INNER JOIN
(SELECT T.kodP, t.dt
FROM myTable AS t LEFT JOIN myTable AS T3 ON (t.kodP=t3.kodP) AND (t.dt>t3.dt)
WHERE t3.kodP is null) as a
ON (Table.dt=a.dt) AND (Table.kodP=a.kodP) SET myTable.s1 = myTable.s2;
...
Рейтинг: 0 / 0
19.07.2003, 10:07
    #32212750
VIG
VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Доброе утро всем.Решил на трезвую голову поделиться своими мыслями.
2 am(a_mitin)
Классный запрос! Я почему то с "детства" недолюбливал коррелированные запросы.Очевидно был неправ. Но мне кажется ,что здесь можно обойтись без in, т.е сделать
Код: plaintext
1.
2.
UPDATE Таблица1 AS t1 SET t1.Sum1 = [t1].[Sum2] 
WHERE (((t1.Dt) = (SELECT Min(t2.Dt) AS [Min-Dt] 
FROM Таблица1 t2 WHERE t2.Kod = t1.Kod)))

ИМХО на больших наборах должно работать быстрее.

2 yuniki
А нужен ли тебе UPDATE ?
Например запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT myTable.KodP,iif(a.KodP is null,myTable.s1,myTable.s2) as S1,
myTable.S2
FROM myTable LEFT JOIN
   (SELECT T.kodP, t.dt
   FROM myTable AS t LEFT JOIN myTable AS T3 
                      ON (t.kodP=t3.kodP) AND (t.dt>t3.dt)
   WHERE t3.kodP is null) as a
ON (myTable.dt=a.dt) AND (myTable.kodP=a.kodP)

возвращает то ,что нужно .
...
Рейтинг: 0 / 0
19.07.2003, 12:12
    #32212775
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Блин. Два раза не прав в одном топике - это перебор... :^)
...
Рейтинг: 0 / 0
19.07.2003, 12:57
    #32212782
am (a_mitin)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
Я почему то с "детства" недолюбливал коррелированные запросы.Очевидно был неправ.
Да, коррелированные запросы не всегда приемлемое решение из-за вопросов производительности. Но часто вполне нормальное.
А по поводу того что в данном случае = будет быстрей чем In... Я в этом сомневался, стало интересно, поэтому решил проверить
Вот скриптик, который написал для тестирования (писал для Ms SQL Server, для Access лень было планы запросов смотреть).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
if exists (select * from dbo.sysobjects where id 
= object_id(N'[dbo].[Таблица1]') and OBJECTPROPERTY(id, N'IsUserTable') =  1 )
drop table [dbo].[Таблица1]
GO

CREATE TABLE [dbo].[Таблица1] (
	[Dt] [int] NOT NULL ,
	[Kod] [int] NOT NULL ,
	[Sum1] [money] NOT NULL ,
	[Sum2] [money] NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Таблица1] WITH NOCHECK ADD 
	CONSTRAINT [DF_Таблица1_Sum1] DEFAULT ( 0 ) FOR [Sum1],
	CONSTRAINT [DF_Таблица1_Sum2] DEFAULT ( 0 ) FOR [Sum2],
	CONSTRAINT [PK_Таблица1] PRIMARY KEY  CLUSTERED 
	(
		[Dt],
		[Kod]
	)  ON [PRIMARY] 
GO
set nocount on
declare @iMax int, @i int
select @iMax =  100000 , @i =  1 
WHILE @i<@iMax
BEGIN
	INSERT INTO [Таблица1](Dt, Kod, Sum1, Sum2)
	VALUES(@i,convert(int, RAND()* 100 ), 1 , 2 )
	set @i=@i+ 1 
END


После этого смотрим планы выполнения запросов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
UPDATE t1 
SET t1.Sum1 = [t1].[Sum2] 
FROM Таблица1 t1
WHERE (t1.Dt) In (SELECT Min(t2.Dt) 
FROM Таблица1 t2 WHERE t2.Kod = t1.Kod)

UPDATE t1 
SET t1.Sum1 = [t1].[Sum2] 
FROM Таблица1 t1
WHERE (t1.Dt) = (SELECT Min(t2.Dt) 
FROM Таблица1 t2 WHERE t2.Kod = t1.Kod)


И видим что они абсолютно одинаковые. Вот такие:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  | --Clustered Index Update(OBJECT:([Northwind].[dbo].[Таблица1].[PK_Таблица1]), SET:([Таблица1].[Sum1]=[t1].[Sum2]))
 
       | --Table Spool
 
            | --Top(ROWCOUNT est 0)
 
                 | --Nested Loops(Inner Join, OUTER REFERENCES:([t2].[Kod], [Expr1002]) WITH PREFETCH)
 
                      | --Hash Match(Aggregate, HASH:([t2].[Kod]) DEFINE:([Expr1002]=MIN([t2].[Dt])))
 
                      |    | --Clustered Index Scan(OBJECT:([Northwind].[dbo].[Таблица1].[PK_Таблица1] AS [t2]))
 
                      | --Clustered Index Seek(OBJECT:([Northwind].[dbo].[Таблица1].[PK_Таблица1] AS [t1]), SEEK:([t1].[Dt]=[Expr1002] AND [t1].[Kod]=[t2].[Kod]) ORDERED FORWARD)
 

Значит говорить о том, что один запрос выполняется быстрее другого оснований вроде бы нет.

Кстати, по поводу скорости коррелированных запросов - сравнил производительность того запроса, который ты привел первый раз (некоррелированного) с этим коррелированным. Так вот, судя по полному Cost запроса, который показывает Execution Plan - он (некоррелированный) медленней примерно в 86 раз (84,8 против 0,982) ;)
...
Рейтинг: 0 / 0
19.07.2003, 13:58
    #32212791
VIG
VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить поле с наименьшим значением другого поля в группе записей
2 am(am_mitin)
Что я могу сказать?
Опыт-критерий истины! и добавить
VIG мой друг,но истина дороже
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как обновить поле с наименьшим значением другого поля в группе записей / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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