Thread
-
Multiple SELECT statements Using One WITH statement
Avi Weinberg <aviw@gilat.com> — 2022-01-20T12:48:39Z
Hi, Can I have multiple select statements using one WITH statement? WITH t AS ( Select A, B from ... ) SELECT A into tableA FROM t where ....; SELECT B into tableB FROM t where ....; IMPORTANT - This email and any attachments is intended for the above named addressee(s), and may contain information which is confidential or privileged. If you are not the intended recipient, please inform the sender immediately and delete this email: you should not copy or use this e-mail for any purpose nor disclose its contents to any person. -
Re: Multiple SELECT statements Using One WITH statement
David G. Johnston <david.g.johnston@gmail.com> — 2022-01-20T12:58:24Z
On Thursday, January 20, 2022, Avi Weinberg <AviW@gilat.com> wrote: > Hi, > > > > Can I have multiple select statements using one WITH statement? > > > > WITH t AS ( > > Select A, B from … > > ) > > SELECT A into tableA FROM t where ….; > > > > SELECT B into tableB FROM t where ….; > > > With q1 as (), q2 as (), q3 as () main_query David J.
-
RE: Multiple SELECT statements Using One WITH statement
Avi Weinberg <aviw@gilat.com> — 2022-01-20T14:42:13Z
Thanks David for the reply, but my question was a little different. I know I can have multiple CTE queries like you showed, but I want to have one single WITH query, and use it in multiple queries, not just by one query the directly proceed the CTE. Why do I need to execute the CTE query twice if I have two queries that wants to use it? Thanks From: David G. Johnston [mailto:david.g.johnston@gmail.com] Sent: Thursday, January 20, 2022 2:58 PM To: Avi Weinberg <AviW@gilat.com> Cc: pgsql-general@lists.postgresql.org Subject: Re: Multiple SELECT statements Using One WITH statement On Thursday, January 20, 2022, Avi Weinberg <AviW@gilat.com<mailto:AviW@gilat.com>> wrote: Hi, Can I have multiple select statements using one WITH statement? WITH t AS ( Select A, B from … ) SELECT A into tableA FROM t where ….; SELECT B into tableB FROM t where ….; With q1 as (), q2 as (), q3 as () main_query David J. IMPORTANT - This email and any attachments is intended for the above named addressee(s), and may contain information which is confidential or privileged. If you are not the intended recipient, please inform the sender immediately and delete this email: you should not copy or use this e-mail for any purpose nor disclose its contents to any person. -
Re: Multiple SELECT statements Using One WITH statement
Josef Šimánek <josef.simanek@gmail.com> — 2022-01-20T15:13:31Z
čt 20. 1. 2022 v 13:48 odesílatel Avi Weinberg <AviW@gilat.com> napsal: > > Hi, Hello! > > > Can I have multiple select statements using one WITH statement? > > > > WITH t AS ( > > Select A, B from … > > ) > > SELECT A into tableA FROM t where ….; > > > > SELECT B into tableB FROM t where ….; > I think it is not possible that way. Instead you can "cache" the query result into a temporary table. CREATE TEMPORARY TABLE ... ON COMMIT DROP could be useful here. There is simple example mentioned in this (https://stackoverflow.com/a/52384424/319233) stackoverflow answer. > > IMPORTANT - This email and any attachments is intended for the above named addressee(s), and may contain information which is confidential or privileged. If you are not the intended recipient, please inform the sender immediately and delete this email: you should not copy or use this e-mail for any purpose nor disclose its contents to any person.
-
Re: Multiple SELECT statements Using One WITH statement
Johannes Graën <johannes@selfnet.de> — 2022-01-20T15:28:29Z
On 20/01/2022 15.42, Avi Weinberg wrote: > Thanks David for the reply, but my question was a little different. > > I know I can have multiple CTE queries like you showed, but I want to > have one single WITH query, and use it in multiple queries, not just by > one query the directly proceed the CTE. > > Why do I need to execute the CTE query twice if I have two queries that > wants to use it? When data is going to be provided to an application via a REST API, I find this pattern quite useful: WITH list AS ( SELECT generate_series(1,10) AS n ) SELECT json_build_object( 'even', ( SELECT json_agg(n) FROM ( SELECT n FROM list WHERE n%2 = 0 ) even ), 'odd', ( SELECT json_agg(n) FROM ( SELECT n FROM list WHERE n%2 = 1 ) odd ) ) obj; If data is to be written to separate tables, writing the intermediate result to a temporary table as explained by Josef might be the simplest solution. -
Re: Multiple SELECT statements Using One WITH statement
David G. Johnston <david.g.johnston@gmail.com> — 2022-01-20T16:45:49Z
On Thu, Jan 20, 2022 at 7:42 AM Avi Weinberg <AviW@gilat.com> wrote: > > > Thanks David for the reply, but my question was a little different. > > I know I can have multiple CTE queries like you showed, but I want to > have one single WITH query, and use it in multiple queries, not just by one > query the directly proceed the CTE. > > Why do I need to execute the CTE query twice if I have two queries that > wants to use it? > > > Sorry, that was a bit of a drive-by for me. I figured you could easily test whether your proposed query structure would work and figured maybe you didn't realize that CTEs could be chained together. The short answer is that a query can only output a single result set so having two top-level select statements is simply prohibited. And result sets are not cached between statements so it isn't like there would be any place to store intermediate CTE results automatically. As you've been told, you can do that with temporary tables (it's a much bigger pain if you want something that isn't session-local). You can always write: CREATE VIEW cte_view AS WITH cte AS (...) SELECT * FROM cte; And then incorporate that into any queries that require the results of said CTE. David J.
-
Re: Multiple SELECT statements Using One WITH statement
Ken Tanzer <ken.tanzer@gmail.com> — 2022-01-20T23:32:10Z
On Thu, Jan 20, 2022 at 8:46 AM David G. Johnston < david.g.johnston@gmail.com> wrote: > You can always write: > > CREATE VIEW cte_view AS > WITH cte AS (...) > SELECT * FROM cte; > > And then incorporate that into any queries that require the results of > said CTE. > > Is there any advantage to still using a CTE inside the view definition, and then selecting it? Instead of just CREATE VIEW cte_view AS (...); Just curious, in case I'm missing something! Cheers, Ken -- AGENCY Software A Free Software data system By and for non-profits *http://agency-software.org/ <http://agency-software.org/>* *https://demo.agency-software.org/client <https://demo.agency-software.org/client>* ken.tanzer@agency-software.org (253) 245-3801 Subscribe to the mailing list <agency-general-request@lists.sourceforge.net?body=subscribe> to learn more about AGENCY or follow the discussion.
-
Re: Multiple SELECT statements Using One WITH statement
David G. Johnston <david.g.johnston@gmail.com> — 2022-01-20T23:34:15Z
On Thu, Jan 20, 2022 at 4:32 PM Ken Tanzer <ken.tanzer@gmail.com> wrote: > > > On Thu, Jan 20, 2022 at 8:46 AM David G. Johnston < > david.g.johnston@gmail.com> wrote: > >> You can always write: >> >> CREATE VIEW cte_view AS >> WITH cte AS (...) >> SELECT * FROM cte; >> >> And then incorporate that into any queries that require the results of >> said CTE. >> >> > Is there any advantage to still using a CTE inside the view > definition, and then selecting it? Instead of just > > CREATE VIEW cte_view AS > (...); > > Just curious, in case I'm missing something! > > No. That would be tunnel vision and early morning posting on my part. David J.
-
Re: Multiple SELECT statements Using One WITH statement
David G. Johnston <david.g.johnston@gmail.com> — 2022-01-20T23:35:14Z
On Thu, Jan 20, 2022 at 4:34 PM David G. Johnston < david.g.johnston@gmail.com> wrote: > On Thu, Jan 20, 2022 at 4:32 PM Ken Tanzer <ken.tanzer@gmail.com> wrote: > >> >> >> On Thu, Jan 20, 2022 at 8:46 AM David G. Johnston < >> david.g.johnston@gmail.com> wrote: >> >>> You can always write: >>> >>> CREATE VIEW cte_view AS >>> WITH cte AS (...) >>> SELECT * FROM cte; >>> >>> And then incorporate that into any queries that require the results of >>> said CTE. >>> >>> >> Is there any advantage to still using a CTE inside the view >> definition, and then selecting it? Instead of just >> >> CREATE VIEW cte_view AS >> (...); >> >> Just curious, in case I'm missing something! >> >> > No. That would be tunnel vision and early morning posting on my part. > > Though I suspect if the CTE had a MATERIALIZED modifier there would be a difference. You can force a view to be materialized. David J.