首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么列别名在H2 CTE中不起作用?

在H2数据库中,CTE(Common Table Expression)是一种临时表达式,它允许我们在查询中创建一个临时的命名结果集。CTE可以在查询中多次引用,提高查询的可读性和复用性。

然而,在H2数据库中,列别名在CTE中不起作用的原因是因为H2数据库的查询优化器在处理CTE时的实现方式。在H2中,CTE被视为一个派生表,而派生表的列名是根据查询中的表达式或子查询的列名来确定的,而不是根据CTE中的列别名。

因此,当我们在CTE中使用列别名时,H2数据库会忽略这些别名,而使用派生表的列名作为结果集的列名。这可能会导致查询结果的列名与我们期望的不一致。

尽管列别名在H2 CTE中不起作用,但我们仍然可以通过在CTE中使用表达式或子查询的列名来引用列。此外,我们还可以在CTE之后使用SELECT语句来为结果集中的列指定别名,以满足我们的需求。

总结起来,H2数据库中的CTE不支持列别名的原因是因为H2将CTE视为派生表,而派生表的列名是根据表达式或子查询的列名来确定的。为了解决这个问题,我们可以使用表达式或子查询的列名来引用列,并在CTE之后使用SELECT语句来指定列的别名。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQLorder by的高级用法

导读 为什么只有ORDER BY后面可以使用别名 为什么不推荐使用ORDER BY后接数字来排序 为什么视图和子查询里面不能使用ORDER BY …… 小伙伴们进行SQL排序时,都能很自然的使用到...集合的行之间没有预先定义的顺序,它只是成员的一种逻辑组合,成员之间的顺序无关紧要。 如下图,每一个括号里的内容就是一条记录,没排序前,他们都是随机分布集合。...所以如果你WHERE,GROUP BY,或HAVING后面使用别名均会报错。 我们举例测试一下。...五、T-SQL中表表达式加了TOP可以使用ORDER BY 我们从第四点的报错信息可以看到:另外还指定了 TOP、OFFSET 或 FOR XML是可以使用ORDER BY的。 这又是为什么呢?...这里的ORDER BY只对当前的子查询生效,到了主查询是不起作用的。必须在主查询末尾继续添加一个ORDER BY子句才能对结果集生效,就像我们例子写的那样。

9510
  • 除了会排序,你对ORDER BY的用法可能一无所知!

    导读 为什么只有ORDER BY后面可以使用别名 为什么不推荐使用ORDER BY后接数字来排序 为什么视图和子查询里面不能使用ORDER BY …… 小伙伴们进行SQL排序时,都能很自然的使用到...集合的行之间没有预先定义的顺序,它只是成员的一种逻辑组合,成员之间的顺序无关紧要。 如下图,每一个括号里的内容就是一条记录,没排序前,他们都是随机分布集合。...所以如果你WHERE,GROUP BY,或HAVING后面使用别名均会报错。 我们举例测试一下。 示例表Customers结构及数据如下: ?...从上面的几个测试示例的结果,可以得出我们的结论是正确的:ORDER BY子句是唯一能重用别名的一步。...这里的ORDER BY只对当前的子查询生效,到了主查询是不起作用的。必须在主查询末尾继续添加一个ORDER BY子句才能对结果集生效,就像我们例子写的那样。

    2.3K30

    基础很重要~~04.表表达式-上篇

    3.物理上不是真实存在的什么对象,它们是虚拟的。对于表达式的查询在数据库引擎内部都将转化为对底层对象的查询。 为什么使用表表达式: 1.使用表表达式的好处是逻辑方面,性能上没有提升。...在外部查询的任何字句中都可以引用在内部查询的SELECT字句中分配的别名。...在这个例子,使用嵌套派生表的目的是为了重用别名。但是,由于嵌套增加了代码的复杂性,所以对于本例考虑使用方案一。...) SELECT * FROM O1 外联格式:别名写在外部查询 WITH 表名(别名) AS ( 内部查询 ) 外部查询 例子: WITH O1(custid_1,companyname...CTE和派生表相关具有以下优势: 如果要在一个CTE引用另一个CTE,不须要像派生表那样进行嵌套,只需要在同一个WITH字句中定义多个CTE,并用逗号把它们分隔开。

    1.5K120

    如何编写便于团队阅读和维护的SQL语句

    由于SQL语句学习简单,表达能力强,上手容易的有点,所以在数据处理SQL语句就成为了最通用的和最优先考虑处理方式。大数据 SQL 应用主要分两种:一种是周期性的统计任务,另一种是分析任务。...1、关键字使用大写 SQL关键字使用大写,表和使用小写(oracle除外,oracle默认表、就是大写)。SQL函数都使用大写这样可以进行更好的区分,尽管这里有一些争议,但是我建议这样使用。...3、使用别名提高可读性 添加别名是为明确表或含义说明的方法。当表和的名称没有意义时,请给它们加上别名,尤其是包含子查询的时候(Hive中子查询必须有别名),这样可以使得阅读SQL时更加的方便。...另外:“基于 WHERE 子句”的语法——也称被为 ANSI-89——是 ANSI-92 更旧的规范,这就是为什么一般数据库还支持他的原因,但是万一以后不支持了呢(虽然不太可能)?...,肯定会看到这个WITH操作,HiveCTE是保存在内存的,可以提高执行速度。

    1K20

    SQLServerCTE通用表表达式

    本期专栏,我将给出示例并解释它们的使用方法和适用情况。我还将演示 CTE 是如何处理递归逻辑并定义递归 CTE 的运行方式的。...例如,一个视图可以表示一个 SELECT 语句,该语句会将 10 个表联接起来,选择许多,然后根据涉及的一组逻辑来过滤行。接着,可以通过其他 SELECT 语句整个数据库查询该视图。...WITH 关键字后面是 CTE 的名称,接着是一个别名的可选列表。别名对应于 CTE 内的 SELECT 语句返回的。可选别名的后面是 AS 关键字,这是必需的。...接着跟随 CTE 其后的是通过别名引用 CTE 的 SELECT 语句。 理解 CTE  设计 CTE 之前,必须理解它的工作原理和遵循的规则。...从递归成员可以检索相同的,但是 SalesLevel 的计算方式是:取当前员工的主管,收集主管的 SalesLevel,然后在其基础上增加 1。

    3.8K10

    sparksql源码系列 | 生成resolved logical plan的解析规则整理

    对于每个主查询和子查询,此替换后未内联的所有CTE定义都将分组一个`WithCTE`节点下。任何不包含CTE或已内联所有CTE的主查询或子查询显然都不会有任何`WithCTE`节点。...此规则检测此类查询,并将所需属性添加到原始投影,以便在排序过程可用。添加另一个投影以排序后删除这些属性。HAVING子句还可以使用SELECT未显示的分组。...注:CTECTESubstitution处理。 ResolveSubqueryColumnAliases Resolution fixedPoint 用投影替换子查询的未解析别名。...CleanupAliases Cleanup fixedPoint 清除计划不必要的别名。...请注意,如果表达式具有不在其子表达式的其他表达式参数,例如RuntimeReplacable,则此规则别名转换无法用于这些参数。

    3.6K40

    建议收藏——Mazur 的 SQL 风格指南

    命约定 将主键放到最前面,然后是外键,最后是其他。如果有任何系统(如 created_at、updated_at、is_deleted 等等,把它们放到最后。...from users inner join charges on users.id = charges.user_id group by email 当有多个连接条件时,请将每个条件放在它们自己的缩进行:...有两个例外: 如果需要在同一个查询多次连接到一个表,并且需要区分这几个之间的不同,那么就需要别名。 另外,如果表名很长或有歧义,可以使用别名(但仍然需要使用有意义的名称)。...使用 CTE 时,用新行填充查询。 使用任意的 CTE 时,始终使用 final 和 select * from final 。...通过这种方式,可以快速检查查询中使用的其他 CTE 输出,以便调试结果。 结尾的 CTE 括号应该使用与 with 和 CTE 名称相同的缩进。

    88420

    【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

    如果比较两个null,结果是不相等的,false check约束当做true,例如要求某大于0,当插入null时是成功的,认为null>0是ture。...如果比较两个null,结果是相等的,这种比较unique约束、集合运算(例如union 、except)、排序、分组,都认为是相等的。...3、添加外部行(外连接) 二、where 由于还未分组,不能使用聚合函数;还未select,不能使用select中指定的别名。...六、order by 这一步返回的不再是有效的表,而是游标,这也是为什么改语句不能用在表表达式的原因。(还记得表表达式吗?...视图、内联表值函数、派生表、cte 例外情况,是和top搭配使用时,作为获取前n条的逻辑有限顺序,此时返回的行,并未排序,不保证顺序,这点需要注意。

    604110

    利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    H2数据库引擎获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码。...这是最近的一次参与遇到的情况,Windows系统上的H2数据库引擎实例版本1.2.141公开了其Web控制台。...但如何将库加载到H2服务器上呢?虽然Windows上的Java支持UNC路径并提取文件,但其拒绝实际加载它。而且这在Linux上也不起作用。那么,如何将文件写入H2服务器呢?...使用 H2 写入任意文件 查看和研究了一些H2函数后,我们发现了一个FILE_WRITE文件写入函数。不幸的是,FILE_WRITE是1.4.190引入的。...而我们需要的是1.2.141可用的函数。最终我们找到了一个名为CSVWRITE的函数,这也是唯一一个名称带“ write”的函数。 快速测试显示了CSV标头也被打印了出来。

    1.2K30

    记录下关于SQL Server的东西

    递归成员是一个引用了CTE名称的查询,对CTE名称的引用表示查询一个执行序列逻辑上的“前一个结果集”,第一次调用递归成员时,它表示的就是定位点成员的查询结果,之后调用递归时,引用CTE则代表前一次调用所返回的结果集...返回的查询结果上,两个成员必须保持一直(的属性); 例如: 定位点成员对HR.Employees表empid=2的结果进行查询,这个查询只执行一次; 递归成员则对CTE(前一次查询的结果集)和Employees...数据库透视转换:所谓透视转换(pivoting)就是把数据从行的状态转化为的状态,当然对应的还有逆透视转换(unpivoting):就是数据从的状态转化为行的状态。...其语法格式为: PIVOT后圆括号内指定聚集函数(比如sum)聚集元素、扩展元素以及目标列名称的列表,as后面可以为结果表指定一个别名。...语句中也可以定义第三种字句when not matched by source,表示当目标表的一个行,来源表没有行可以与之匹配的时候,和when not matched 区别在于:when not

    1.3K10

    SQL高级查询方法

    联接条件可通过以下方式定义两个表查询的关联方式: 指定每个表要用于联接的。典型的联接条件一个表中指定一个外键,而在另一个表中指定与其关联的键。...CTE 与派生表类似,具体表现在不存储为对象,并且只查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询引用多次。 CTE 可用于: 创建递归查询。...不需要常规使用视图时替换视图,也就是说,不必将定义存储元数据。 启用按从标量嵌套 select 语句派生的进行分组,或者按不确定性函数或有外部访问的函数进行分组。...可以在用户定义的例程(如函数、存储过程、触发器或视图)定义 CTECTE 由表示 CTE 的表达式名称、可选列表和定义 CTE 的查询组成。...CTE 的语句 5SELECT 6FROM expression_name; 1-- 定义 CTE 查询别名和列名称 2WITH Sales_CTE (SalesPersonID

    5.7K20

    T-SQL—理解CTEs

    锚成员查询定义不包含CTE而循环成员包括。另外,锚成员查询需要出现在CTE递归成员查询之前,且两者返回的完全相同。...我将两个子查询转移到两个不同的CTEs,第一个CTE用Sales来命名,定义了的第二个子查询,叫做SalesQuota第一个CTE后面用逗号分隔与第二个。...定义完成后,引用这两个别名来实现最终的select 语句,结果与之前复杂的代码结果完全相同。....,在这个CTE  我汇总了TotalSales ,通过组合SalesYear。...何时使用CTE 当然我们学习了如何使用CTE就要知道什么时候来使用它,下面三种情况是使用CTE简化你的T-SQL语句的情况: 查询需要递归 查询中有多个子查询,或者你有重复的相同的子查询单一语句中。

    2K90

    T-SQL—理解CTEs

    锚成员查询定义不包含CTE而循环成员包括。另外,锚成员查询需要出现在CTE递归成员查询之前,且两者返回的完全相同。...我将两个子查询转移到两个不同的CTEs,第一个CTE用Sales来命名,定义了的第二个子查询,叫做SalesQuota第一个CTE后面用逗号分隔与第二个。...定义完成后,引用这两个别名来实现最终的select 语句,结果与之前复杂的代码结果完全相同。....,在这个CTE 我汇总了TotalSales ,通过组合SalesYear。...何时使用CTE 当然我们学习了如何使用CTE就要知道什么时候来使用它,下面三种情况是使用CTE简化你的T-SQL语句的情况: 查询需要递归 查询中有多个子查询,或者你有重复的相同的子查询单一语句中。

    1.4K10

    【SQL揭秘】有多少种数据库,就有多少类CTE

    Common Table Expression Common table expression简称CTE,由SQL:1999标准引入,可以认为是单个 SELECT、INSERT、UPDATE、DELETE...CTE 与派生表类似,具体表现在不存储为对象,并且只查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询引用多次。...), PostgreSQL (since 8.4), MariaDB (since 10.2), SQLite (since 3.8.3), HyperSQL and H2 (experimental)...CTE的使用 CTE使语句更加简洁 例如以下两个语句表达的是同一语义,使用CTE比未使用CTE的嵌套查询更简洁明了。 1) 使用嵌套子查询 ? 2) 使用CTE ? CTE 可以进行树形查询 ?...,CTE会解析多次,因此此版本CTE有简化SQL的作用,但效率上没有效提高。

    2.8K70

    sparksql源码系列 | 最全的logical plan优化规则整理(spark2.3)

    InlineCTE Finish Analysis Once 如果满足以下任一条件,则将CTE定义插入相应的引用:1. CTE定义不包含任何非确定性表达式。...如果此CTE定义引用了另一个具有非确定性表达式的CTE定义,则仍然可以内联当前CTE定义。2.整个主查询和所有子查询CTE定义只被引用一次。...此外,由于相关子查询的复杂性,无论上述条件如何,相关子查询的所有CTE引用都是内联的。...2.当两个Project运算符之间有LocalLimit/Sample/Repartition运算符,且上层的Project由相同数量的组成,且数相等或具有别名时。...冗余别名是不会更改的名称或元数据,也不会消除重复数据的别名

    2.5K10
    领券