使用eMERGE OMOP MS SQL版T2DM算法时,创建#临时表遇语法错误
解决OMOP T2DM算法代码的Syntax Error问题
错误根源
#qualified_events是MS SQL专属的本地临时表语法,如果你的当前数据库不是MS SQL(比如PostgreSQL、MySQL、BigQuery等),会直接触发语法错误。另外你贴的代码中子查询没有别名,部分数据库(如PostgreSQL)也会报错,这可能是你改了临时表仍出错的核心原因。
分数据库修正方案
1. PostgreSQL环境
用CREATE TEMP TABLE ... AS替代SELECT ... INTO #表名,同时给子查询加别名:
CREATE TEMP TABLE qualified_events AS SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id FROM ( select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, pe.visit_occurrence_id FROM primary_events pe ) sub -- 补充原算法中可能存在的筛选逻辑,比如取第一条记录 WHERE ordinal = 1;
临时表会在会话结束后自动删除,无需手动清理。
2. MySQL环境
使用CREATE TEMPORARY TABLE ... AS语法,同时补全子查询别名:
CREATE TEMPORARY TABLE qualified_events SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id FROM ( select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, pe.visit_occurrence_id FROM primary_events pe ) sub -- 按原算法需求添加筛选条件 WHERE ordinal = 1;
MySQL临时表仅当前会话可见,关闭会话后自动销毁。
3. BigQuery环境
使用BigQuery的会话临时表语法:
CREATE OR REPLACE TEMP TABLE qualified_events AS SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id FROM ( select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, pe.visit_occurrence_id FROM primary_events pe ) sub WHERE ordinal = 1;
额外注意事项
原代码是MS SQL专属版本,可能还有其他语法差异:
- 日期函数:MS SQL的
DATEADD在PostgreSQL中是DATE_TRUNC或+ INTERVAL,MySQL中是DATE_ADD - 分页/取数:MS SQL的
TOP N在其他数据库中可能是LIMIT N - 字符串函数:如
SUBSTRING的参数顺序可能不同
如果修正临时表后仍报错,需逐行排查这些语法差异。
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

