2013-04-13 8 views
0

Можно ли вставить и обновить в том же запросе?использовать UPDATE и INSERT в том же запросе

ПЕРЕД:

MemberID | SubsID | StartDate | EndDate 
------------------------------------------------ 
1001  | 10  | 2012-12-21 | 2012-12-31 
2002  | 10  | 2012-12-22 | 

ПОСЛЕ:

MemberID | SubsID | StartDate | EndDate 
------------------------------------------------ 
1001  | 10  | 2012-12-21 | 2012-12-31 
2002  | 10  | 2012-12-22 | 2012-04-13 
2002  | 10  | 2012-04-13 | 

Получить строки:

select * from MemberSubs 
where SubsID = 10 and EndDate is null; 

Вставка новых строк:

insert into 
    MemberSubs(MemberID, SubsID, Price, StartDate) 
select 
    MemberID, SubsID, Price, Current Date 
from 
    MemberSubs 
where 
    SubsID = 10 
    and 
    EndDate is null 

Обновление старых строк:

update MemberSubs 
set 
    EndDate = current date 
where 
    SubsID = 10 
    and 
    EndDate is null 
    and 
    StartDate < Current Date 

Можно ли добиться этого в одном запросе (без использования хранимых процедур или запуска и т.д.)

Спасибо вы.

+0

Duplicate as above - вы ищете инструкцию 'MERGE'. – Yuck

+0

Спасибо за сообщение о заявлении MERGE, но может кто-то, пожалуйста, дать понять, как достичь этого, используя MERGE? Как бы выглядел мой запрос MERGE? Я никогда не использовал MERGE. – MrSimpleMind

+0

Я не понимаю, как MERGE может это решить? Вы уверены, что это можно решить, используя инструкцию MERGE? Я прочитал руководства ibm и другие pdf-файлы и т. Д. Я не могу понять, как сделать обновление и вставить в тот же запрос, это не «обновление или вставка», это «обновление и вставка» (или «вставка и обновление» независимо от того, с какого запроса я начинаю). – MrSimpleMind

ответ

0

у вас есть 2 варианта:

  1. использовать триггеры (смотрите после "DB2 9.5 Cookbook" на Google, на странице 333. Theres образец с использованием триггеров с историческими данными)

  2. обновления для DB2 Версии 10 и использовать системное время для запроса исторических данных с запросами во времени.