【问题标题】:What does the SQL standard say about parentheses in SQL UNION/EXCEPT/INTERSECT statements?SQL 标准对 SQL UNION/EXCEPT/INTERSECT 语句中的括号有何规定?
【发布时间】:2011-01-11 00:45:09
【问题描述】:

我正在尝试编写一个适用于 MySQL 和 SQLite 的 SQL UNION。

(select_clause_A) UNION (select_clause_B)

SQLite 不喜欢这些语句的括号(请参阅 '复合运算符'): http://www.sqlite.org/lang_select.html

不幸的是,如果您使用 'order by' 子句: http://dev.mysql.com/doc/refman/5.0/en/union.html

有谁碰巧知道哪个数据库遵循 SQL 标准?我想可能他们俩都是……

【问题讨论】:

标签: sql mysql sqlite


【解决方案1】:

UNION 语句中不需要括号/括号。

MySQL 是我目前知道的唯一一个,它允许您定义特定于每个查询的 ORDER BYLIMIT 子句,只要查询括在括号中——标准 SQL 只允许ORDER BY 获取最终结果。 GROUP BYHAVING 子句特定于构成 UNION 语句的每个查询。

MySQL 支持:

 (SELECT a.column
    FROM A_TABLE a
ORDER BY a.column DESC)
UNION
SELECT b.column
  FROM B_TABLE b

...如果您想要/需要移植到其他数据库,这将导致无穷无尽的悲伤。

标准 SQL 只允许:

SELECT a.column
  FROM A_TABLE a
UNION
SELECT b.column
  FROM B_TABLE b
ORDER BY column DESC

【讨论】:

  • @nate c:你有建设性的批评意见吗?否则,您只是想在获得最高投票数的答案中寻找可见度……看起来很聪明。
  • 该标准允许在联合的第一部分进行子查询 - 因此限制将在另一个级别。 MiniSQl 没有真正的子查询。
  • Postgres 也允许排序和限制。
【解决方案2】:

MySQL 不需要括号,据我所知,阅读规范不应该在那里。

MySQL 也是非标准的,因为它支持联合的每个“部分”中的 ORDER BY,所以如果你是为非 MySQL 编写它,你无论如何都不能这样做。

【讨论】:

    【解决方案3】:

    您可以在 SQLite 中执行此操作:

     select col1, col2.. from ( select col1, col2 from T  order by col1 limit 5)
     union
     select col1, col2.. from ( select col1, col2 from T  order by col2 desc limit 10)
    

    不确定 mySQl。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多