Re: UPDATE table to a joined query... - Mailing list pgsql-general

From Bruno Wolff III
Subject Re: UPDATE table to a joined query...
Date
Msg-id 20031016175916.GB29306@wolff.to
Whole thread Raw
In response to Re: UPDATE table to a joined query...  (Bruno Wolff III <bruno@wolff.to>)
List pgsql-general
You appear to have accidentally just replied to me.

On Thu, Oct 16, 2003 at 12:48:35 -0400,
  Mike Leahy <mgleahy@fes.uwaterloo.ca> wrote:
> Okay...that seems to work.  However, there are two things that are causing
> me problems.  First, if I use the statement exactly as you have it in your
> reply I get 'ERROR:  parser: parse error at or near "." at character 15' -
> it doesn't seem to like the 'a.' before the first reference to the column
> being named.  It's clearly nothing serious - I suppose it's redundant to put
> it there anyway, since we've already indicated we're updating the columns in
> table 'a' to begin with.

That was my mistake. A table name there makes no sense since as you noted
the column has to be in the table being updated.

> Second, update I'm trying to run is about 20000 records (both in the table
> being updated, and in the joined query).  When I run this update, there is
> the usual length of time to run the query itself, then when it begins
> updating my processor sits at 100% for about 15 minutes (with a 2.4 GHz
> processor).  Is this normal, or is my update statement structured poorly
> somehow?  I tried dumping the query to a table rather than executing it
> within the update statement, and that didn't make much difference (example
> below).

An explain analyze would probably be useful to see.

> update tbl_ind_manzanas set poblacion = c.thecount from (select cod_manzana,
> thecount from tbl_ind_manzanas left join tmp_query on
> tbl_ind_manzanas.cod_manzana = tmp_query.cod_manz) as c where
> tbl_ind_manzanas.cod_manzana = c.cod_manzana;
>
> Can anyone suggest how this might possibly be improved so that it isn't so
> computationally intensive?

You probably want want to create an index on tmp_query (cod_manz) (and of
course (tbl_ind_manzanas (cod_manzana)) so that you don't need to do a sort
or nestloop to do the left join.

>
> At any rate...it seems to work fine despite the length of time to execute.
> Thanks for the help Bruno.
>
> Mike
>
>
> -----Original Message-----
> From: Bruno Wolff III [mailto:bruno@wolff.to]
> Sent: October 16, 2003 10:30 AM
> To: Mike Leahy
> Cc: pgsql-general@postgresql.org
> Subject: Re: [GENERAL] UPDATE table to a joined query...
>
> On Wed, Oct 15, 2003 at 22:39:39 -0400,
>   Mike Leahy <mgleahy@fes.uwaterloo.ca> wrote:
> > Hello all,
> >
> > This question is related to updating tables - is there any way to
> calculate or
> > update the values in a column in a table to the values in a field produced
> by
> > a query result?  An example of what I'm trying to do is below:
> >
> > update (tbl_ind_mananas LEFT JOIN (select count(*) as count, (dubicacion
> ||
> > zona || manzana) as cod_manzana from tbl_censo_poblacion_1993 group by
> > dubicacion, zona, manzana) tbl1 on relacion = cod_manzana) as tbl2 set
> > poblacion = count;
> >
> > Basically I have a table (tbl_ind_manzanas) with a unique code (relacion)
> that
> > can be linked to a field in the query result (cod_manzana).  I want to
> update
> > a field in the table with the count(*) result in the query.  The update
> > statement (as I have attempted it above) doesn't work...it seems that I
> can do
> > nothing but directly update the values in a table.  As soon as I try to
> supply
> > anything other than just a table to the update statement, it doesn't like
> it.
> >
> > I'm sure others have experience with this issue...it seems to me that
> there
> > would be many cases where such an approach would be useful.  I'm hoping
> > there's another method that I might be able to use that could accomplish
> > essentially the same result.  Any suggestions are greatly appreciated.
>
> A similar question was asked in the last week.
>
> You want to do the join in the from item list and than join the table
> being updated to the join from the from item list in the where clause.
>
> Something like:
> update a set a.count = c.count from (select a left join b) as c
>   where a.id = c.id;
>

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: problem with function to report how many records were changed
Next
From: Bruce Momjian
Date:
Subject: Re: Why I can't combine %TYPE with [] ?