Re: UPDATE Query problem
От | Stephan Szabo |
---|---|
Тема | Re: UPDATE Query problem |
Дата | |
Msg-id | 20020117171611.H57470-100000@megazone23.bigpanda.com обсуждение исходный текст |
Ответ на | UPDATE Query problem ("Josh Berkus" <josh@agliodbs.com>) |
Список | pgsql-sql |
On Thu, 17 Jan 2002, Josh Berkus wrote: > Folks, > > I have a database that contains a chronological journal of activity. For > various reasons, this journal contains both complete and incomplete records, > and while all records are timestamped, the primary key is not strictly ordered > by timestamp. > > What I want to do is update each incomplete record with the contents of the > last previous complete record. As a simple-minded test case: > > CREATE TABLE history AS ( > history_id SERIAL PRIMARY KEY, > period_date TIMESTAMP, > fieldA VARCHAR(30), > fieldB INT4 ); > > CREATE VIEW complete_history_records AS > SELECT history.* > FROM history WHERE fieldA IS NOT NULL > and fieldB IS NOT NULL > > UPDATE history SET fieldA = chr.fieldA > fieldB = chr.fieldB > FROM (SELECT complete_history_records.* > WHERE ??? ) chr > WHERE (history.fieldA IS NULL or > history.fieldB IS NULL); > > The problem is that I cannot figure out a subselect that will allow me to > select the last complete history record prior to the one being updated. It > seems like I need to reference a field in the main query in the subselect, > which can't be done. > > To further hamper things, for portability reasons, I can use neither SELECT > DISTINCT ON nor custom functions. Isn't update...from already an extension? In any case, is performance really important? I think something like: update history set fieldA=chr.fieldA, fieldB=chr.fieldB from complete_history_records chr where (history.fieldA is null or history.fieldB is null) and chr.period_date=(select max(period_date) from complete_history_records where period_date<history.period_date); might work if really slow.
В списке pgsql-sql по дате отправления: