CTE中使用SELECT *时,列顺序是否能得到保证?
关于UNION ALL中CTE的
SELECT *列顺序问题 在你提供的SQL示例里,两处SELECT *完全能保证沿用来源CTE定义的列顺序,原因如下:
- CTE本质是数据库生成的临时结果集,定义时就明确了列的名称、顺序和数据类型,数据库会为其维护完整的元数据(包括
ordinal_position这类列顺序标识),和物理表的元数据逻辑一致。 - 对于
UNION ALL操作,当两侧查询的结果集结构完全匹配(列数、数据类型、列名一致)时,数据库会严格按照各自CTE定义的列顺序进行合并,不会出现列错位的情况。你的示例中cte_a和cte_b都明确定义了col_1、col_2的顺序,所以完全安全。
额外提醒
虽然当前场景下写法没问题,但不建议依赖SELECT *:
- 如果后续修改CTE结构(比如新增、删除或调整列顺序),
SELECT *会自动引入变更,很可能导致UNION ALL因结构不匹配报错,甚至出现数据错位的隐蔽问题。 - 显式列出列名(比如
SELECT col_1, col_2 FROM cte_a)的写法更清晰、健壮,能避免这类潜在风险。
内容的提问来源于stack exchange,提问作者IgorM
相关产品推荐
相关产品推荐

