powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / привести поведение UPDATE на SQL Server к поведению как у Access
11 сообщений из 11, страница 1 из 1
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726567
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И снова, здравствуйте.
При переводе системы с mdb+mdb на mdb+SQL возникла очередная проблема, вызванная различным поведением Access и SQL server. Заключается она в следующем: при обновлении поля таблицы данными из присоединённой таблицы, в случае, когда на каждую строку исходной таблицы приходится несколько строк присоединённой, результат для Access получается как суммарное/последовательное обновление каждой из соотнессёных строк. А результат SQL Server (как и написано в его документации) недетерминированное обновление какой нибудь из соотнесённых строк.

В Access:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CurrentDb.Execute "CREATE TABLE A (id int, valA real);"
CurrentDb.Execute "CREATE TABLE B (id int, valB real);" 
CurrentDb.Execute "insert into A(id, valA) VALUES (1, 1);"
CurrentDb.Execute "insert into A(id, valA) VALUES (1, 2);"
CurrentDb.Execute "insert into A(id, valA) VALUES (1, 3);"
CurrentDb.Execute "insert into A(id, valA) VALUES (2, 1);"
CurrentDb.Execute "insert into A(id, valA) VALUES (2, 2);"
CurrentDb.Execute "insert into A(id, valA) VALUES (3, 0);"
CurrentDb.Execute "insert into B(id, valB) VALUES (1, 0);"
CurrentDb.Execute "insert into B(id, valB) VALUES (2, 0);"
CurrentDb.Execute "insert into B(id, valB) VALUES (3, 0);"
CurrentDb.Execute "UPDATE A INNER JOIN B ON A.id = B.id SET B.valB = B.valB + A.valA;"
docmd.OpenTable "B"


Получается:
id valB1 62 33 0

На SQL server:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE A (id int, valA real);
insert into A(id, valA) VALUES (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (3, 0);

CREATE TABLE B (id int, valB real);
insert into B(id, valB) VALUES (1, 0), (2, 0), (3, 0);

UPDATE B SET B.valB = B.valB + A.valA FROM A INNER JOIN B ON A.id = B.id ;

SELECT * FROM B;


Получается:
id valB1 12 13 0

Исправить проблему для одного простого запроса можно группировкой:
Код: sql
1.
UPDATE B SET B.valB = B.valB + AA.valA FROM (SELECT SUM(valA) as valA, id FROM A GROUP BY id) AS AA INNER JOIN B ON AA.id = B.id ;


Но, таких запросов много и они, в основном, не простые. Писать программу по исправлению текста запросов не просто.
Но есть ли другие варианты?
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726673
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monster,

Во втором случае получается что в В добавились только первые из А...
Может изменить формирование А:
- первый раз insert (для нового id)
- далее update (старое значение + новое)
Тогда и второй этап не нужен (в А будет то, что должно было быть в В)
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726677
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monster, дикие запросы какие-то. Перепишите лучше их. Как вы к ним вообще пришли?
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726690
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

Insertы тут для наполнения тестовых таблиц.
По факту есть "целевая" таблица в которой данные обновляются данными из другой таблицы. Проблема возникает когда одной строке целевой таблицы соответствует несколько чужих строк. Аксес обновляет целевую строку каждой чужой, а SQL server обновляет целевую строку одной случайной чужой строкой.

P.S.: В базе есть UPDATEы в которых присутствуют JOINы 3 - 5 таблиц. И целевая таблица в середине цепочки этих JOINов, поэтому просто обернуть в суммирующий группирующий подзапрос не получается.
Хотя 90% запросов подходят для "оборачивания"
Запросов с UPDATEприблизительно5 таблиц14 таблицы 293 таблицы 1282 таблицы 5721 таблица 685всего1415
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726693
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Легаси код, накопленный за 20 лет.
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726934
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл еще такой запрос:
Код: sql
1.
UPDATE A INNER JOIN B ON A.id = B.id SET B.valB = B.valB + 1;


Т.е. Аксесс в B.valB впишет количество соединённых строк из A.
Ну а SQL Server просто 1.
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726957
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monsterНашёл еще такой запрос:
Код: sql
1.
UPDATE A INNER JOIN B ON A.id = B.id SET B.valB = B.valB + 1;


Т.е. Аксесс в B.valB впишет количество соединённых строк из A.
Ну а SQL Server просто 1.

потому что логики в запросах нет при такой структуре.
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726972
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинпотому что логики в запросах нет при такой структуре.
Я это знаю. Я, ещё до осознания проблемы с UPDATE, один запрос такого типа для ускорения переписал в аксессе и при пререписывании пользовался логикой SQL Server, естественно получил везде 1, что прокатило на тестовых данных, но было обнаружено на реальных.
И хочу понять как это исправить, какие есть варианты, кроме ручного переписывания ?
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39726986
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monsterОзверинпотому что логики в запросах нет при такой структуре.
Я это знаю. Я, ещё до осознания проблемы с UPDATE, один запрос такого типа для ускорения переписал в аксессе и при пререписывании пользовался логикой SQL Server, естественно получил везде 1, что прокатило на тестовых данных, но было обнаружено на реальных.
И хочу понять как это исправить, какие есть варианты, кроме ручного переписывания ?

я вас настоятельно советую переписать, потому что найденный костыль может только усугубить ситуацию.
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39727127
4d_monsterИсправить проблему для одного простого запроса можно группировкой:
Код: sql
1.
UPDATE B SET B.valB = B.valB + AA.valA FROM (SELECT SUM(valA) as valA, id FROM A GROUP BY id) AS AA INNER JOIN B ON AA.id = B.id ;

А вы тестировали этот запрос? ИМХО, если в источнике используется не обновляемый запрос, то вся конструкция будет не обновляемой.
А с DSum() прокатит.
...
Рейтинг: 0 / 0
привести поведение UPDATE на SQL Server к поведению как у Access
    #39727190
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов Анатолий4d_monsterИсправить проблему для одного простого запроса можно группировкой:
Код: sql
1.
UPDATE B SET B.valB = B.valB + AA.valA FROM (SELECT SUM(valA) as valA, id FROM A GROUP BY id) AS AA INNER JOIN B ON AA.id = B.id ;


А вы тестировали этот запрос? ИМХО, если в источнике используется не обновляемый запрос, то вся конструкция будет не обновляемой.
А с DSum() прокатит.

Я это на сервере тестировал, там можно обновлять без Dsum.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / привести поведение UPDATE на SQL Server к поведению как у Access
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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