单个UNION语句中不允许的子句

时间:2013-03-16 11:24:48

标签: c# java sql sql-server database

我正在用C#和Java编写查询构建器,并担心生成UNION语句。我知道UNION子句中的每个单独语句都不能包含ORDER BY子句,而必须将其放在完整的union语句的末尾。我还应该注意其他任何条件吗?即通常适用于单个选择语句的条件,但是当置于UNION语句中时会引起问题?据我所知,每个单独的语句都可以包含GROUP BY,WHERE和HAVING。我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

根据SQL syntax specification,返回多行的select语句是一个查询表达式,后跟一个可选的ORDER BY子句:

<direct_select_statement:multiple_rows> ::=
    <query_expression> [ <order_by_clause> ]

反过来,查询表达式定义为

<query_expression> ::= <non-join_query_expression> | <joined_table>

和非连接查询表达式是指定UNION的位置:

<non-join_query_expression>    ::= 
     <non-join_query_term>
 |     <query_expression> UNION [ ALL ] [ <corresponding_spec> ] <query_term>
 |     <query_expression> EXCEPT [ ALL ] [ <corresponding_spec> ] <query_term>

因此,在ORDER BY子句中的单个查询表达式中使用UNION ALL在语法上是不正确的;没有其他类似的查询子句不能在UNION中使用。