Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обновить данные одной таблицы из другой таблицы (Часть 2)  [new]
Sonic_ru
Member

Откуда:
Сообщений: 2107
К автору этой темы отношения не имею, просто название выскочило при создании новой темы, и оно мне показалось более правильным чем написанное мной.
И так есть таблица
Table1
Str num Date + еще много других полей которые в контексте текущего вопроса не важны
F001 1 2011-06-25 20:07:15.207
F001 2 2011-06-25 20:07:18.030
A021 1 2011-06-25 20:07:18.035
F001 1 2011-06-25 20:07:18.237
С003 3 2011-06-25 20:07:19.330
F001 2 2011-06-25 20:07:20.861

из этой таблицы формируется Table 2

insert into Table2
select Str, num, max(Date) as Date
from Table1
group by Str, Num
Т.е. получится такой результат.

Table2
Str num Date
A021 1 2011-06-25 20:07:18.035
F001 1 2011-06-25 20:07:18.237
С003 3 2011-06-25 20:07:19.330
F001 2 2011-06-25 20:07:20.861

Table1 довольно большая,
Теперь допустим Table1 дополнилась.

Table1
Str num Date + еще много других полей которые в контексте текущего вопроса не важны
F001 1 2011-06-25 20:07:15.207
F001 2 2011-06-25 20:07:18.030
A021 1 2011-06-25 20:07:18.035
F001 1 2011-06-25 20:07:18.237
С003 3 2011-06-25 20:07:19.330
F001 2 2011-06-25 20:07:20.861
F001 1 2011-06-25 20:07:28.327
С003 3 2011-06-25 20:07:39.130
F006 5 2011-06-25 20:07:40.861

Как оптимально можно обновить эти данные в Table2 что бы получилось

Table2
Str num Date
A021 1 2011-06-25 20:07:18.035
F001 2 2011-06-25 20:07:20.861
F001 1 2011-06-25 20:07:28.327
С003 3 2011-06-25 20:07:39.130
F006 5 2011-06-25 20:07:40.861


Сначала я начал писать
insert into Table2
select Str, num, max(Date) as Date
from Table1 where Date>=(select max(Date) from Table2)   ...
group by Str, Num

Но ведь тогда записи задвоятся получится несколько записей. Table2

Str num Date
A021 1 2011-06-25 20:07:18.035
F001 1 2011-06-25 20:07:18.237
С003 3 2011-06-25 20:07:19.330
F001 2 2011-06-25 20:07:20.861
F001 1 2011-06-25 20:07:28.327
С003 3 2011-06-25 20:07:39.130
F006 5 2011-06-25 20:07:40.861

Заново сбрасывать Table2 и снова применять первый запрос для всей таблицы довольно затратно
Может есть какой то более оптимальный способ ?
6 июл 11, 12:05    [10930940]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить данные одной таблицы из другой таблицы (Часть 2)  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Sonic_ru,

Тригером (пример особо не проверял, на глаз посмотрел)


USE TEMPDB
if OBJECT_ID ('tempdb..t') is not null
	drop table t
go	
if OBJECT_ID ('tempdb..t2') is not null
	drop table t2
go
create table t (str varchar(10), num int,date datetime)
go

insert into t  values
('F001', 1, '2011-06-25 20:07:15.207'),
('F001', 2, '2011-06-25 20:07:18.030'),
('A021', 1, '2011-06-25 20:07:18.035'),
('F001', 1, '2011-06-25 20:07:18.237'),
('С003', 3, '2011-06-25 20:07:19.330'),
('F001', 2, '2011-06-25 20:07:20.861')


select * from t

go


select Str, num, max(date) as Date
into   t2
from t
group by Str, Num

go



CREATE TRIGGER TTT On T
AFTER INSERT
AS 
MERGE T2 AS T2
USING INSERTED T1 ON T1.STR=T2.STR
WHEN MATCHED AND NOT (T1.DATE=T2.DATE) THEN
	UPDATE SET T2.DATE=T1.DATE
WHEN NOT MATCHED BY TARGET THEN 
	INSERT (str , num ,date )	
	VALUES (T1.STR, T1.NUM, T1.DATE)
;

GO	


INSERT INTO T VALUES 
('С003', 3, '2011-06-25 20:17:39.130'),
('F006', 5, '2011-06-25 20:07:40.861')
GO

SELECT * FROM T
SELECT * FROM T2
6 июл 11, 12:38    [10931298]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить