Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обновление данных в таблице / 6 сообщений из 6, страница 1 из 1
15.06.2021, 20:10
    #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
15.06.2021, 20:27
    #40077773
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных в таблице
1. Это точно MS SQL?
2. возможно, дело в SET DATE = mt. date
Вы обновляете дату из FROM main_table mt , а там date как раз и есть " 10.янв"
...
Рейтинг: 0 / 0
15.06.2021, 20:39
    #40077776
Дмитрий86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных в таблице
godsql,
Да, там дата как раз 10.01, но как сделать, чтобы эта запись не обновлялась при update,так как по ней есть действие I? Нужно добавить доп.условие где происходит апдейт
...
Рейтинг: 0 / 0
15.06.2021, 21:03
    #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
15.06.2021, 21:23
    #40077789
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных в таблице
а вообще, подумайте, как лучше привести таблицы к нормальной форме
у вас строчки одинаковые
соответственно, и определить с какими нужно работаь - тяжело

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


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