代码之家  ›  专栏  ›  技术社区  ›  Francesco Mantovani

SQL Server:WHERE子句中的行数()返回“无效列名”

  •  0
  • Francesco Mantovani  · 技术社区  · 6 年前

    几天来我一直在工作 this 列出世界上所有IP地址的免费开源数据库。

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

    1. 全部 country_code 在这个世界上
    2. 全部 city_name 世界上只有一次
    3. Latitude longitude 每个城市的
    4. 倒计时命令 desc 国家代码

    我做到了:

    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 
    

    enter image description here

    当我取消注释时问题就来了 where countdown_order < '100' 查询返回我

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

    enter image description here

    是的,我试着用 CTE 但它会返回更多的错误,因为 ORDER BY .

    我不知道下一步该怎么做。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Squirrel    6 年前

    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 
    
        2
  •  1
  •   Kashyap MNVL    6 年前

    您也可以使用公共表表达式(cte)来实现。看起来像这样:

    ;WITH MAIN_CTE AS (
    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
    ) 
    SELECT * FROM MAIN_CTE 
    WHERE countdown_order < 100
    ORDER BY country_code, city_name