【问题标题】:When does SELECT query starts with a 'With'SELECT 查询何时以“With”开头
【发布时间】:2020-11-18 07:05:25
【问题描述】:

我正在阅读这个问题How to determine type of the sql query for jdbcTemplate in JAVA?。正确答案是,SELECT 查询可以以SELECTWITH 开头。

仅供参考,答案说:

// SELECT subqueries are irrelevant for the final result. So the command, the first verb is indicative of the result (int updateCount vs. ResultSet).

boolean isSqlSelect = sql.toUpperCase().startsWith("SELECT")
                   || sql.toUpperCase().startsWith("WITH");

所以,现在假设我有一个查询

SELECT id, name, email FROM users;

问题

  1. 如何重写以WITH 开头的查询?
  2. 虽然问题是针对 JDBC 的,但它是否适用于所有 SQL 和 ODBC/JDBC?

【问题讨论】:

    标签: mysql sql jdbc odbc


    【解决方案1】:

    WITHcommon table expressions (CTE) 的语法。这是所有合理的数据库基本上都支持的标准 SQL 语法(MySQL 是最后一个添加这种支持的)。

    CTE 用于定义可以在查询中多次引用的子查询。

    请注意,CTE 可以与 UPDATEDELETE 语句以及 SELECT 一起使用,因此它们不一定表示 SELECT

    【讨论】:

    • 那么所有支持sql的数据库都通用吗?
    • @Chilarai 我对此进行了研究,发现除了 Informix 之外,所有主要的 SQL 实现现在都支持 CTE 的 WITH 语法(MySQL 8.0 是最后一个采用它的)。 stackoverflow.com/a/325243/20860
    • @Chilarai 。 . .几乎所有我称之为数据库的东西。
    • 更正:Informix 14.10 在 2019 年的 14.10 版中增加了对 WITH 的支持。我已经更新了上面链接的答案。
    • 喂! MS Access 缺少 的标准 SQL 功能。甚至不必费心列出缺少的内容。
    【解决方案2】:

    因为您还问过如何使用 CTE 重写您的查询...

    with cte as
    
    (select id, name, email 
     from users)
    
    select * from cte;
    

    我发现在 with 子句的早期定义列名更简洁,因此我为 select 节省了一些空间

    with cte (id, name, email) as
    
    (select *
     from users)
    
    select * from cte;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多