Teradata UNION查询报')'与UNION关键字间语法错误排查修复
报错触发原因
这个Teradata语法错误的核心触发原因有2个:
- 派生表别名位置不符合Teradata语法规则:当用
UNION ALL连接多个SELECT子句作为派生表使用时,别名必须定义在整个UNION结果集的最外层括号之外。原写法只给第二个SELECT子查询单独加了AS M别名,没有把UNION连接的两个查询作为整体包裹,解析器读到第一个子查询的右括号后,没有找到预期的派生表别名,直接碰到UNION关键字就抛出了报错。 - 第二个SELECT分支存在字段错位问题:原第二个SELECT的字段列表里,在
DISEASE_COND_NAME的别名定义后多写了裸字段DISEASE_COND_NAME,和第一个SELECT分支的字段顺序、数量不匹配,即使修正别名位置也会触发字段数不匹配的运行错误。
修正步骤
- 给
UNION ALL连接的两个SELECT整体套一层外层括号,把派生表别名M移到这层整体括号的外侧,删除第二个子查询右括号后单独加的别名定义。 - 对齐两个SELECT分支的字段顺序、数量和对应位置的数据类型:根据业务逻辑调整第二个分支里错位的字段,做对应类型转换后加正确别名,保证两个分支同位置字段的数据类型兼容。
修正后参考SQL
-- 外层可根据业务需求替换为具体查询字段 SELECT * FROM ( SELECT RUN_DT, CAST(LOB AS VARCHAR(11)) AS LOB, MBRID, MEDICAID_NBR, CAST(DISEASE_COND AS VARCHAR(50)) AS DISEASE_COND, CAST(DISEASE_COND_NAME AS VARCHAR(100)) AS DISEASE_COND_NAME, CAST(NULL AS VARCHAR(150)) AS HCC_SUBCAT_DESC, PLAN_DIM_CK, STATE_CODE, GAP_IND1, GAP_IND2, RISK_MODEL, AID, PRO_GENERIC_PRODUCT_DESC, RATE_CELL_DESC, DIAG, DIAG_DESC, DOS, NDC, NDC_DESC, MEMBER_MONTHS, RISK_SCORE, GAP_PROBABILITY FROM MEDICAID_CONDITIONS UNION ALL SELECT RUN_DT, LOB, MEMBERID AS MBRID, CAST(NULL AS VARCHAR(30)) AS MEDICAID_NBR, DISEASE_COND, CAST(DISEASE_COND_NAME AS VARCHAR(100)) AS DISEASE_COND_NAME, CAST(NULL AS VARCHAR(150)) AS HCC_SUBCAT_DESC, PLAN_DIM_CK, STATE_CODE, GAP_IND1, GAP_IND2, CAST(RISK_MODEL AS VARCHAR(20)) AS RISK_MODEL, CAST(NULL AS VARCHAR(20)) AS AID, CAST(NULL AS VARCHAR(72)) AS PRO_GENERIC_PRODUCT_DESC, CAST(NULL AS VARCHAR(72)) AS RATE_CELL_DESC, DIAG, DIAG_DESC, DOS, NDC, NDC_DESC, MEMBER_MONTHS, RISK_SCORE, GAP_PROBABILITY FROM MARKETPLACE_CONDITIONS ) AS M
注意:上述代码中第二个分支的字段映射按照第一个分支的字段顺序做了对齐,如果业务上对第二个表的字段映射有特殊要求,只需要保证两个UNION分支的字段数量一致、同位置字段类型兼容即可。
内容的提问来源于stack exchange,提问作者user18532223
相关产品推荐
相关产品推荐

