pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Stephan Szabo <sszabo@megazone.bigpanda.com>
To: Marty Scholes <marty@outputservices.com>
Cc: pgsql-sql@postgresql.org
Subject: Re: correlated multi-set update?
Date: Tue, 9 Mar 2004 15:14:26 -0800 (PST)
Message-ID: <20040309151307.E7528@megazone.bigpanda.com> (raw)
In-Reply-To: <404E3BC9.7050000@outputservices.com>
References: <404E3BC9.7050000@outputservices.com>


On Tue, 9 Mar 2004, Marty Scholes wrote:

> Hello,
>
> My company recently deployed Pg 7.4.1. on Solaris for an experimental
> project and is using the experience to evaluate its viability for
> migration from Oracle 7.0.
>
> While I like a lot of the features of Pg, one thing I noticed that
> "seems" to be missing is the ability to set multiple fields in an update
> using a correlated subquery.
>
> For example, I have a statement that copies fields from a template (bar)
> into another table (foo) based on a list of keys in a third table (keylist):
>
> UPDATE foo f
> SET (f1, f2, f3, f4, f5) = (
>    SELECT f1, f2, f3, f4, f5
>    FROM bar b
>    WHERE f.fk = b.pk
>    )
> WHERE f.pk IN (
>    SELECT l.pk
>    FROM keylist l
>    );
>
> In Oracle this works wonders, but it seems to fail under Pg because Pg
> wants single field updates and does not allow subqueries.
>
> Next I tried:
>
> UPDATE foo f
> SET f1 = (
>    SELECT f1
>    FROM bar b
>    WHERE f.fk = b.pk
>    ),
> f2 = (
>    SELECT f2
>    FROM bar b
>    WHERE f.fk = b.pk
>    ),
> f3 = (
>    SELECT f3
>    FROM bar b
>    WHERE f.fk = b.pk
>    ),
> f4 = (
>    SELECT f4
>    FROM bar b
>    WHERE f.fk = b.pk
>    ),
> f5 = (
>    SELECT f5
>    FROM bar b
>    WHERE f.fk = b.pk
>    )
> WHERE f.pk IN (
>    SELECT l.pk
>    FROM keylist l
>    );
>
> That seemed to get closer, but still barfed (apparently) because of a
> lack of table aliasing and correlated subqueries.  This makes the
> process become an iterative one.
>
> Am I missing something here?

You're not allowed to alias the update target table, so I think you'd need
to remove the f alias and refer to foo anywhere you're currently referring
to f.




view thread (3+ messages)  latest in thread

Message-ID: <20040309151307.E7528@megazone.bigpanda.com>
Permalink:  ../20040309151307.E7528@megazone.bigpanda.com/
Also on:    postgresql.org/message-id/20040309151307.E7528@megazone.bigpanda.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: sszabo@megazone.bigpanda.com, marty@outputservices.com
  Subject: Re: correlated multi-set update?
  In-Reply-To: <20040309151307.E7528@megazone.bigpanda.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox