首页 > 解决方案 > SQL Server:WHERE 子句中的 ROW_NUMBER() 返回“无效的列名”

问题描述

几天以来,我一直在使用这个免费的开源数据库,它列出了世界上所有的 IP 地址。

我的目标是创建一个可以列出的数据库:

  1. country_code世间万物
  2. 全世界city_name都拍一次
  3. Latitudelongitude每个城市
  4. desc上的倒计时命令country_code

我做到了:

SELECT 
ROW_NUMBER() OVER (ORDER BY country_code desc,city_name desc) as countdown_order,
AVG(latitude) AS latitude, 
AVG(longitude) AS longitude, 
city_name, 
country_code
FROM ip2location_db11 
--where countdown_order < '100'
GROUP BY country_code, city_name
ORDER BY country_code, city_name 

在此处输入图像描述

当我取消注释where countdown_order < '100' 查询返回我时出现问题

Msg 207, Level 16, State 1, Line 8 
Invalid column name 'countdown_order'.

在此处输入图像描述

是的,我尝试使用CTE,但由于ORDER BY.

我不确定下一步该尝试什么。

标签: sql-serverwhere-clausecommon-table-expressionrow-number

解决方案


countdown_order是列别名。您不能引用同一级别的列别名。

但是,您可以在更高级别执行此操作,例如派生表或 cte

SELECT *
FROM
(
    SELECT 
          ROW_NUMBER() OVER (ORDER BY country_code desc, 
                                      city_name desc) as countdown_order,
          AVG(latitude) AS latitude, 
          AVG(longitude) AS longitude, 
          city_name, 
          country_code   
    FROM  ip2location_db11 
    GROUP BY country_code, city_name
) as D
where countdown_order < 100   -- countdown_order is an integer, remove the single quote
ORDER BY country_code, city_name 

推荐阅读