From: Tom Lane Date: Tue, 5 Oct 2021 14:24:15 +0000 (-0400) Subject: Doc: improve description of UNION/INTERSECT/EXCEPT syntax. X-Git-Tag: REL9_6_24~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=086cda1d98238abf4f94c3edb6f4004abc9de705;p=thirdparty%2Fpostgresql.git Doc: improve description of UNION/INTERSECT/EXCEPT syntax. queries.sgml failed to mention the rather important point that INTERSECT binds more tightly than UNION or EXCEPT. I thought it could also use more discussion of the role of parentheses in these constructs. Per gripe from Christopher Painter-Wakefield. Discussion: https://postgr.es/m/163338891727.12510.3939775743980651160@wrigleys.postgresql.org --- diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml index 634b91908f6..2f012abd49c 100644 --- a/doc/src/sgml/queries.sgml +++ b/doc/src/sgml/queries.sgml @@ -1651,17 +1651,9 @@ SELECT DISTINCT ON (expression , query1 INTERSECT ALL query2 query1 EXCEPT ALL query2 - query1 and + where query1 and query2 are queries that can use any of - the features discussed up to this point. Set operations can also - be nested and chained, for example - -query1 UNION query2 UNION query3 - - which is executed as: - -(query1 UNION query2) UNION query3 - + the features discussed up to this point. @@ -1695,6 +1687,47 @@ SELECT DISTINCT ON (expression , . + + + Set operations can be combined, for example + +query1 UNION query2 EXCEPT query3 + + which is equivalent to + +(query1 UNION query2) EXCEPT query3 + + As shown here, you can use parentheses to control the order of + evaluation. Without parentheses, UNION + and EXCEPT associate left-to-right, + but INTERSECT binds more tightly than those two + operators. Thus + +query1 UNION query2 INTERSECT query3 + + means + +query1 UNION (query2 INTERSECT query3) + + You can also surround an individual query + with parentheses. This is important if + the query needs to use any of the clauses + discussed in following sections, such as LIMIT. + Without parentheses, you'll get a syntax error, or else the clause will + be understood as applying to the output of the set operation rather + than one of its inputs. For example, + +SELECT a FROM b UNION SELECT x FROM y LIMIT 10 + + is accepted, but it means + +(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10 + + not + +SELECT a FROM b UNION (SELECT x FROM y LIMIT 10) + +