powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обновление данных в таблице
6 сообщений из 6, страница 1 из 1
Обновление данных в таблице
    #40077768
Дмитрий86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!

Есть базовая таблица main_table следующего вида:
id metric date_valid date property action1 10 10.янв ? 154 I1 11 10.янв ? ? U1 10 10.янв ? 154 D1 12 10.янв ? ? I1 12 10.янв ? ? I

где поле action - действие, которое было совершено с записью (I - вставка, U - обновление, D - удаление)

Данные из нее вставляются в волатильную таблицу с помощью след. запроса: (только те записи где действие action = I и U)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO volatile_table      
SELECT      
id,     
metric,     
COALESCE(mt.date, DATE'9999-12-31') AS DATE  ,   
property        
FROM main_table mt      
WHERE mt.action IN ('I', 'U') AND mt.id IS NOT NULL




Видим содержимое волатильной таблицы:
Id metric date property1 10 31.12.9999 1541 11 31.12.9999 ?1 12 31.12.9999 ?1 12 31.12.9999 ?

Далее обновляем данные в волатильной таблице при помощи запроса:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
UPDATE a            
FROM volatile_table a           
(           
SELECT          
id,         
metric       ,   
COALESCE(mt.date, mt.date_valid, DATE'9999-12-31') AS DATE      ,    
property            
FROM main_table mt          
WHERE mt.action IN ('D') AND mt.id IS NOT NULL          
) s         
SET         
DATE = mt.date




Видим результат:
id metric date property1 10 10.01.2021 1541 11 31.12.9999 ?1 12 31.12.9999 ?1 12 31.12.9999 ?

Из конечного результата видно, что запись
id metric date property1 10 10.01.2021 154
имеет date = 10.01.2021, а нужно чтобы была date = 31.12.9999, т.е. она обновляется так как запись с действием D тоже присутствует у метрики 10.

Подскажите, как при обновлении учесть (наложить условие, чтобы не обновлялись записи где есть по метрикам и I и D)?
мое предположение, что можно в запрос обновления добавить условие с NOT EXISTS

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
UPDATE a            
FROM volatile_table a           
(           
SELECT          
id,         
metric          ,
COALESCE(mt.date, mt.date_valid, DATE'9999-12-31') AS DATE  ,        
property            
FROM main_table mt          
WHERE mt.action IN ('D') AND mt.id IS NOT NULL  
   AND NOT EXISTS (SELECT           
id,         
metric         , 
COALESCE(mt.date, mt.date_valid, DATE'9999-12-31') AS DATE    ,      
property            
FROM main_table mt          
WHERE mt.action IN ('I', 'U') AND mt.id IS NOT NULL)
        
) s         
SET         
DATE = mt.date



Но тогда никакие записи не обновляются, подскажите, пожалуйста, еще варианты решения!
Буду благодарен за помощь!
...
Рейтинг: 0 / 0
Обновление данных в таблице
    #40077773
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Это точно MS SQL?
2. возможно, дело в SET DATE = mt. date
Вы обновляете дату из FROM main_table mt , а там date как раз и есть " 10.янв"
...
Рейтинг: 0 / 0
Обновление данных в таблице
    #40077776
Дмитрий86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
Да, там дата как раз 10.01, но как сделать, чтобы эта запись не обновлялась при update,так как по ней есть действие I? Нужно добавить доп.условие где происходит апдейт
...
Рейтинг: 0 / 0
Обновление данных в таблице
    #40077778
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну и допишите

Код: sql
1.
2.
WHERE mt.action IN ('D') AND mt.id IS NOT NULL  
AND NOT EXISTS (SELECT 1 FROM  main_table  WHERE action = mt.action and id = mt.id and action  IN ('I', 'U') )
...
Рейтинг: 0 / 0
Обновление данных в таблице
    #40077789
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вообще, подумайте, как лучше привести таблицы к нормальной форме
у вас строчки одинаковые
соответственно, и определить с какими нужно работаь - тяжело

Id metric date property 1 12 31.12.9999 ?1 12 31.12.9999 ?
...
Рейтинг: 0 / 0
Обновление данных в таблице
    #40078032
Дмитрий86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,спасибо, но при таких условиях обновляется всего 300 записей в таблице, а было около 33 тыс записей с обновлением
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обновление данных в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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