mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Allow WITH clauses to be attached to INSERT, UPDATE, DELETE statements.
This is not the hoped-for facility of using INSERT/UPDATE/DELETE inside a WITH, but rather the other way around. It seems useful in its own right anyway. Note: catversion bumped because, although the contents of stored rules might look compatible, there's actually a subtle semantic change. A single Query containing a WITH and INSERT...VALUES now represents writing the WITH before the INSERT, not before the VALUES. While it's not clear that that matters to anyone, it seems like a good idea to have it cited in the git history for catversion.h. Original patch by Marko Tiikkaja, with updating and cleanup by Hitoshi Harada.
This commit is contained in:
@ -472,7 +472,7 @@ FROM <replaceable>table_reference</replaceable> <optional>, <replaceable>table_r
|
||||
(1 row)
|
||||
</screen>
|
||||
This is because a restriction placed in the <literal>ON</>
|
||||
clause is processed <emphasis>before</> the join, while
|
||||
clause is processed <emphasis>before</> the join, while
|
||||
a restriction placed in the <literal>WHERE</> clause is processed
|
||||
<emphasis>after</> the join.
|
||||
</para>
|
||||
@ -1139,7 +1139,7 @@ SELECT a "value", b + c AS sum FROM ...
|
||||
<para>
|
||||
The naming of output columns here is different from that done in
|
||||
the <literal>FROM</> clause (see <xref
|
||||
linkend="queries-table-aliases">). It is possible
|
||||
linkend="queries-table-aliases">). It is possible
|
||||
to rename the same column twice, but the name assigned in
|
||||
the select list is the one that will be passed on.
|
||||
</para>
|
||||
@ -1539,7 +1539,7 @@ SELECT <replaceable>select_list</replaceable> FROM <replaceable>table_expression
|
||||
|
||||
<para>
|
||||
<literal>WITH</> provides a way to write subqueries for use in a larger
|
||||
<literal>SELECT</> query. The subqueries can be thought of as defining
|
||||
query. The subqueries can be thought of as defining
|
||||
temporary tables that exist just for this query. One use of this feature
|
||||
is to break down complicated queries into simpler parts. An example is:
|
||||
|
||||
@ -1791,12 +1791,20 @@ SELECT n FROM t LIMIT 100;
|
||||
However, the other side of this coin is that the optimizer is less able to
|
||||
push restrictions from the parent query down into a <literal>WITH</> query
|
||||
than an ordinary sub-query. The <literal>WITH</> query will generally be
|
||||
evaluated as stated, without suppression of rows that the parent query
|
||||
evaluated as written, without suppression of rows that the parent query
|
||||
might discard afterwards. (But, as mentioned above, evaluation might stop
|
||||
early if the reference(s) to the query demand only a limited number of
|
||||
rows.)
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The examples above only show <literal>WITH</> being used with
|
||||
<command>SELECT</>, but it can be attached in the same way to
|
||||
<command>INSERT</>, <command>UPDATE</>, or <command>DELETE</>.
|
||||
In each case it effectively provides temporary table(s) that can
|
||||
be referred to in the main command.
|
||||
</para>
|
||||
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
||||
|
@ -21,6 +21,7 @@ PostgreSQL documentation
|
||||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
[ WITH [ RECURSIVE ] <replaceable class="parameter">with_query</replaceable> [, ...] ]
|
||||
DELETE FROM [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ [ AS ] <replaceable class="parameter">alias</replaceable> ]
|
||||
[ USING <replaceable class="PARAMETER">using_list</replaceable> ]
|
||||
[ WHERE <replaceable class="PARAMETER">condition</replaceable> | WHERE CURRENT OF <replaceable class="PARAMETER">cursor_name</replaceable> ]
|
||||
@ -83,6 +84,18 @@ DELETE FROM [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ [ AS ]
|
||||
<title>Parameters</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">with_query</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>WITH</literal> clause allows you to specify one or more
|
||||
subqueries that can be referenced by name in the <command>DELETE</>
|
||||
query. See <xref linkend="queries-with"> and <xref linkend="sql-select">
|
||||
for details.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>ONLY</></term>
|
||||
<listitem>
|
||||
@ -272,7 +285,8 @@ DELETE FROM tasks WHERE CURRENT OF c_tasks;
|
||||
<para>
|
||||
This command conforms to the <acronym>SQL</acronym> standard, except
|
||||
that the <literal>USING</literal> and <literal>RETURNING</> clauses
|
||||
are <productname>PostgreSQL</productname> extensions.
|
||||
are <productname>PostgreSQL</productname> extensions, as is the ability
|
||||
to use <literal>WITH</> with <command>DELETE</>.
|
||||
</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
@ -21,6 +21,7 @@ PostgreSQL documentation
|
||||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
[ WITH [ RECURSIVE ] <replaceable class="parameter">with_query</replaceable> [, ...] ]
|
||||
INSERT INTO <replaceable class="PARAMETER">table</replaceable> [ ( <replaceable class="PARAMETER">column</replaceable> [, ...] ) ]
|
||||
{ DEFAULT VALUES | VALUES ( { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } [, ...] ) [, ...] | <replaceable class="PARAMETER">query</replaceable> }
|
||||
[ RETURNING * | <replaceable class="parameter">output_expression</replaceable> [ [ AS ] <replaceable class="parameter">output_name</replaceable> ] [, ...] ]
|
||||
@ -84,6 +85,26 @@ INSERT INTO <replaceable class="PARAMETER">table</replaceable> [ ( <replaceable
|
||||
<title>Parameters</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">with_query</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>WITH</literal> clause allows you to specify one or more
|
||||
subqueries that can be referenced by name in the <command>INSERT</>
|
||||
query. See <xref linkend="queries-with"> and <xref linkend="sql-select">
|
||||
for details.
|
||||
</para>
|
||||
<para>
|
||||
It is possible for the <replaceable class="parameter">query</replaceable>
|
||||
(<command>SELECT</command> statement)
|
||||
to also contain a <literal>WITH</literal> clause. In such a case both
|
||||
sets of <replaceable>with_query</replaceable> can be referenced within
|
||||
the <replaceable class="parameter">query</replaceable>, but the
|
||||
second one takes precedence since it is more closely nested.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="PARAMETER">table</replaceable></term>
|
||||
<listitem>
|
||||
@ -287,7 +308,9 @@ INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
|
||||
<para>
|
||||
<command>INSERT</command> conforms to the SQL standard, except that
|
||||
the <literal>RETURNING</> clause is a
|
||||
<productname>PostgreSQL</productname> extension. Also, the case in
|
||||
<productname>PostgreSQL</productname> extension, as is the ability
|
||||
to use <literal>WITH</> with <command>INSERT</>.
|
||||
Also, the case in
|
||||
which a column name list is omitted, but not all the columns are
|
||||
filled from the <literal>VALUES</> clause or <replaceable>query</>,
|
||||
is disallowed by the standard.
|
||||
|
@ -21,6 +21,7 @@ PostgreSQL documentation
|
||||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
[ WITH [ RECURSIVE ] <replaceable class="parameter">with_query</replaceable> [, ...] ]
|
||||
UPDATE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ [ AS ] <replaceable class="parameter">alias</replaceable> ]
|
||||
SET { <replaceable class="PARAMETER">column</replaceable> = { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } |
|
||||
( <replaceable class="PARAMETER">column</replaceable> [, ...] ) = ( { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } [, ...] ) } [, ...]
|
||||
@ -79,6 +80,18 @@ UPDATE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ [ AS ] <rep
|
||||
<title>Parameters</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">with_query</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The <literal>WITH</literal> clause allows you to specify one or more
|
||||
subqueries that can be referenced by name in the <command>UPDATE</>
|
||||
query. See <xref linkend="queries-with"> and <xref linkend="sql-select">
|
||||
for details.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="PARAMETER">table</replaceable></term>
|
||||
<listitem>
|
||||
@ -345,7 +358,8 @@ UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
|
||||
<para>
|
||||
This command conforms to the <acronym>SQL</acronym> standard, except
|
||||
that the <literal>FROM</literal> and <literal>RETURNING</> clauses
|
||||
are <productname>PostgreSQL</productname> extensions.
|
||||
are <productname>PostgreSQL</productname> extensions, as is the ability
|
||||
to use <literal>WITH</> with <command>UPDATE</>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
Reference in New Issue
Block a user