powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как обновить поле с наименьшим значением другого поля в группе записей
16 сообщений из 16, страница 1 из 1
Как обновить поле с наименьшим значением другого поля в группе записей
    #32211997
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с 4-мя полями: Dt,KodP,Summa2,Summa
Нужно для всех групп по KodP заменить поле Summa c наименьшим значением в группе поля Dt на значение поля Summa2 .
Можно ли и как это сделать одним запросом ?
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212317
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что - никто не знает, или никто не понял ?..
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212318
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212463
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если "для всех групп по KodP", то что такое "в группе поля Dt"?
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212470
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, совершенно неважно что это такое.
Как только видишь слова "Группы", "Сумма", "Наименьшее значение" и т.п. - так сразу и понимаешь что запрос группировочный. Даже выборку запихнуть в один запрос, то обновляемым это запрос сделать не получится (в аксесе).
Так что на вопрос "Можно ли это сделать одним запросом" ответ "Нельзя"
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212477
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох, я понял. Ты поймал один признак, по которому НЕТ, и сделал вывод, что весь ответ НЕТ. Я тоже так поступил, только я поймал признак, по которому ДА: я вижу, что автор что-то сформулировал не так. Это дает надежду, что ему вообще нужно не то, что мы читаем в его вопросе.
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212481
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ааа, ну если автор сформулировал не так - тогда конечно же ответ:
ДА!
Разумеется можно! Даже очень просто! Как только поймем - что, так сразу и сделаем!
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212705
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, извиняюсь, уже свалил с работы в это время, отвечаю из дома:
Правда, не совсем понятно, что ,собстно, не понятно , могу только то - же другими словами :

В таблице есть группы записей с одинаковым значением поля KodP, а поле Dt в кажой такой группе имеет разные значения ( и конечно , какое-то из них будет наименьшее ). Ну, вот , и надо в таких записях (где находятся эти наименьшие значения поля Dt - в каждой группе такая запись у меня единственная ) в поле Summa заменить значение на значение поля Summa2 ...
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #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
Как обновить поле с наименьшим значением другого поля в группе записей
    #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
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212723
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, был неправ. Слово "сумма" смутило разум.
Позор на мою лохматую голову.
З.Ы. Извинений не дождетесь
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212726
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
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212750
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
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212775
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Блин. Два раза не прав в одном топике - это перебор... :^)
...
Рейтинг: 0 / 0
Как обновить поле с наименьшим значением другого поля в группе записей
    #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
Как обновить поле с наименьшим значением другого поля в группе записей
    #32212791
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 am(am_mitin)
Что я могу сказать?
Опыт-критерий истины! и добавить
VIG мой друг,но истина дороже
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как обновить поле с наименьшим значением другого поля в группе записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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