标准SQL中派生表能否使用带点的结构化标识符?
标准SQL中派生表的点分隔列名规则
核心结论
标准SQL不允许将带点的分层标识符作为派生表的输出列名使用,必须通过AS给这类列指定无点的别名,否则外层查询无法正确解析引用。
原因解析
SQL里的点是用来划分命名空间层级的(比如库.表.列),不属于列名本身的合法字符。派生表的输出列属于该表的直接命名空间,列名中如果包含点,数据库会错误地将DT.employee.id解析为「派生表DT下的子表employee的列id」,但派生表根本不存在名为employee的子表,必然触发语法或解析错误。
错误写法与修正示例
错误写法(会报错)
SELECT DT.employee.id FROM ( SELECT employee.id FROM employee WHERE boss > 69 ) DT
正确写法(重命名列)
SELECT DT.emp_id FROM ( SELECT employee.id AS emp_id -- 用AS指定无点的列别名 FROM employee WHERE boss > 69 ) DT
全限定名的处理
如果子查询中使用了全限定名(比如main_db.employee.id),外层也不能直接用DT.main_db.employee.id引用。子查询里的全限定名只是内部用来定位列的路径,输出到派生表后,该列的默认名称仍然是id,而非完整的全限定名。正确的用法同样是重命名:
SELECT DT.emp_id FROM ( SELECT main_db.employee.id AS emp_id FROM main_db.employee WHERE boss > 69 ) DT
非标准扩展说明
部分数据库(如PostgreSQL)支持用双引号包裹带点的字符串作为列名,强行将点作为列名的一部分,但这是违反SQL标准的非扩展特性,不具备跨数据库兼容性,不推荐使用:
-- 仅部分数据库支持,非标准写法 SELECT DT."employee.id" FROM ( SELECT employee.id AS "employee.id" FROM employee WHERE boss > 69 ) DT
内容的提问来源于stack exchange,提问作者user1698584
相关产品推荐
相关产品推荐

