From: | Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> |
---|---|
To: | Souvik Bhattacherjee <kivuosb(at)gmail(dot)com>, "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
Cc: | "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Method to pass data between queries in a multi-statement transaction |
Date: | 2019-04-18 14:49:56 |
Message-ID: | 7abb82aa-d5c2-4d14-e57c-6e3267bd2085@aklaver.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 4/17/19 5:30 PM, Souvik Bhattacherjee wrote:
> There are few if any situations where you need to immediately and
> completely pass all values from one query to another in the same
> transaction where the queries cannot just be combined into a single
> statement. Your representative example is one that is easily combined
> into a single statement.
>
> > What if I need the result of the join to be stored into table3 as
> well as the tuples that participated in the query to be deleted from
> table1. The following can be done without the need to transfer values
> from the previous query into the next:
>
> begin;
> insert into table3 (id, attr1, attr2) (select t1.cid, t1.empname,
> t2.dept from table1 t1, table2 t2 where t1.cid = t2.cid);
> delete from table1 where cid in (select c.cid from table1 t1, table2 t2
> where t1.cid = t2.cid);
Well the DELETE is not going to work as c.cid will error as undefined.
> commit;
>
> However note that we have to perform the join twice, which is not
> efficient. Now to make things worse, increase the number of tables to
> join while imposing the requirement of tuple deletion to apply to all or
> to a subset of the tables that participate in join.
You might want to take a look at CTE's:
https://www.postgresql.org/docs/11/queries-with.html
>
> Now, the stuff you are trying seems to indicate you are trying to do
> something in C, inside the engine itself, with all of this. If that is
> the case you may want to be more clear as to what you are attempting to
> do. But as far as server SQL goes the only persistence area are
> tables/relations - including temporary ones.
>
>> I'm trying to modify the engine here.
>
> -SB
>
> On Wed, Apr 17, 2019 at 6:16 PM David G. Johnston
> <david(dot)g(dot)johnston(at)gmail(dot)com <mailto:david(dot)g(dot)johnston(at)gmail(dot)com>> wrote:
>
>
> On Wed, Apr 17, 2019 at 3:04 PM Souvik Bhattacherjee
> <kivuosb(at)gmail(dot)com <mailto:kivuosb(at)gmail(dot)com>> wrote:
>
> Hello,
>
> I'm trying to pass some values between queries in a
> multi-statement transaction. For example, consider the following
> representative multi-statement transaction:
>
> begin;
> select * from table1 t1, table2 t2 where t1.cid = t2.cid;
> delete from table1 where cid in
> (values-to-be-populated-from-the-previous-query);
> commit;
>
>
> There are few if any situations where you need to immediately and
> completely pass all values from one query to another in the same
> transaction where the queries cannot just be combined into a single
> statement. Your representative example is one that is easily
> combined into a single statement.
>
> Now, the stuff you are trying seems to indicate you are trying to do
> something in C, inside the engine itself, with all of this. If that
> is the case you may want to be more clear as to what you are
> attempting to do. But as far as server SQL goes the only
> persistence area are tables/relations - including temporary ones.
>
> David J.
>
--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com
From | Date | Subject | |
---|---|---|---|
Next Message | Souvik Bhattacherjee | 2019-04-18 16:02:57 | Re: Method to pass data between queries in a multi-statement transaction |
Previous Message | Ron | 2019-04-18 14:12:31 | Re: Multicolumn index for single-column queries? |