使用ROW_NUMBER()生成rowid后WHERE引用报错:无效列名rowid
解决SQL中无法用SELECT别名在WHERE子句筛选的问题
我有一段SQL查询语句:
SELECT *, ROW_NUMBER() OVER (PARTITION BY RequestID ORDER BY CriticalAssessmentID DESC) AS rowid FROM ApplicationCriticalityAssessment
这段代码能正常运行,会给相同RequestID的记录生成1、2、3……这样递增的rowid。
但当我尝试筛选出rowid=1的记录时,执行下面的语句却报错:
SELECT *, ROW_NUMBER() OVER (PARTITION BY RequestID ORDER BY CriticalAssessmentID DESC) AS rowid FROM ApplicationCriticalityAssessment WHERE rowid = 1
报错信息:
无效的列名 'rowid'。
问题原因
SQL的执行顺序是先执行WHERE子句过滤数据,之后才会执行SELECT子句生成列和别名。这就导致WHERE子句执行时,SELECT里定义的rowid别名还不存在,自然会提示列名无效。
解决方案
可以通过子查询或者公共表表达式(CTE)先计算出rowid,再在外层进行筛选:
方案1:使用子查询
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY RequestID ORDER BY CriticalAssessmentID DESC) AS rowid FROM ApplicationCriticalityAssessment ) AS temp_table WHERE temp_table.rowid = 1
方案2:使用CTE(可读性更强)
WITH temp_table AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY RequestID ORDER BY CriticalAssessmentID DESC) AS rowid FROM ApplicationCriticalityAssessment ) SELECT * FROM temp_table WHERE rowid = 1
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

