Teradata环境下查找序列SEQ缺口SQL报错问题及优化方案问询
报错3807原因
Teradata的关联子查询仅支持1层嵌套的外层表别名引用,你原SQL中的e1是最外层的表别名,在第二层嵌套的子查询中引用e1超出了Teradata支持的别名作用域范围,因此抛出对象e1不存在的错误。Oracle支持更深层级的嵌套别名引用,所以同一段SQL可在Oracle正常运行。
适配Teradata的序列号缺口查找方案
使用Teradata原生支持的LEAD窗口函数实现,相比自连接写法执行效率更高、逻辑更简洁,无需多层子查询:
SELECT pk, seq AS current_seq, next_seq, seq + 1 AS missing_start, next_seq - 1 AS missing_end FROM ( SELECT pk, seq, -- 按pk分组、seq排序,取当前行的下一个seq值 LEAD(seq, 1) OVER (PARTITION BY pk ORDER BY seq) AS next_seq FROM my_table ) t -- 排除每组最后一个seq(无后续值) WHERE next_seq IS NOT NULL -- 差值大于1说明中间存在缺口 AND next_seq - seq > 1;
运行效果验证
针对你给出的测试数据:
| PK | SEQ |
|---|---|
| a | 0 |
| a | 1 |
| a | 3 |
上述SQL执行后返回结果如下,直接定位到缺失的序列号2:
| pk | current_seq | next_seq | missing_start | missing_end |
|---|---|---|---|---|
| a | 1 | 3 | 2 | 2 |
内容的提问来源于stack exchange,提问作者Chrisb
相关产品推荐
相关产品推荐

