【问题标题】:How to use" HAVING "and "ORDER BY" clause in sql如何在sql中使用“HAVING”和“ORDER BY”子句
【发布时间】:2010-08-31 10:32:45
【问题描述】:

我有如下所示的 sql 查询,sql server 说他们在 HAVING 和 ORDER bY 中是错误的,是他们在 HAVING 和 ORDER BY 附近的任何语法错误,谁能帮忙。

SELECT Id,
       Name1,
       ZipCode,
       StreetName,
       StreetNumber,
       State1,
       Lat,
       Lng,
       Keyword,
       ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance 
  FROM Business_Details 
  HAVING (distance < 1.5) and (Keyword like '%plumber%')  
  ORDER BY distance  ; 

【问题讨论】:

    标签: c# asp.net mysql sql-server-2005


    【解决方案1】:

    在此处使用where 而不是having。

    having 可用于缩小聚合值的条件。
    where 可用于缩小非聚合数据的条件。

    更新
    SQL Server 不是 MySQL,它适用于一个...

    1. 可能只是在其他方面工作
    2. 可能需要稍微调整一下 工作
    3. 可能需要完全 重新设计,然后才能工作。

    这应该是你需要的

    SELECT Id, 
           Name1, 
           ZipCode, 
           StreetName, 
           StreetNumber, 
           State1, 
           Lat, 
           Lng, 
           Keyword, 
           ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance  
      FROM Business_Details  
      where (Keyword like '%plumber%')  
      and ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) < 1.5
      ORDER BY ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) ;  
    

    【讨论】:

    • 这不是错误的原因,这是这个问题的重点
    • Having 是错误的原因,如果不添加 group by,您将无法使用它。从 SQL 中可以清楚地看出,用户试图在 Where 子句的上下文中使用 Have 子句。
    • 实际上,您可以使用没有 GROUP BY 子句的 HAVING。此 SQL 运行良好: SELECT COUNT(*) FROM sys.databases HAVING MAX(database_id)
    • 感谢您的回复在这篇特定的文章 code.google.com/apis/maps/articles/phpsqlsearch.html 他们使用了以下查询,其中包含有和 order by 子句,他们正在使用 mysql 服务器我正在使用 sql server 2005 查询 SELECT id 是否有任何区别,(3959 * acos(cos(弧度(37))* cos(弧度(lat))* cos(弧度(lng)-弧度(-122)) + sin( 弧度 (37) ) * sin( 弧度( lat ) ) ) ) 与标记的距离 HAVING distance
    • 是的,它会有所作为。
    【解决方案2】:

    HAVING 通常与 GROUP BY 语句结合使用。 HAVING 就像结果组的 WHERE。

    【讨论】:

    • 在这篇特定的文章code.google.com/apis/maps/articles/phpsqlsearch.html 中,他们使用了以下查询以及有和 order by 子句,他们使用的是 mysql 服务器,因为我使用的是 sql server 2005,它对查询 SELECT id 有什么影响吗? ( 3959 * acos( cos( 弧度(37) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(-122) ) + sin( 弧度(37) ) * sin( 弧度( lat ) ) ) ) AS 距离标记 HAVING distance
    【解决方案3】:

    每个人都已经提到HAVING 用于汇总数据,例如 SUM 和 MIN,您可以将这两个条件放在 WHERE 子句中。

    对于它的价值(我现在无法测试)并希望解决您的实际问题,根据我的经验,您不能在 HAVING 子句中使用列别名,并且必须显式地重写该列的方程而不是别名。

    更多详情请见this question。

    【讨论】:

      【解决方案4】:
      SELECT * from   
       (SELECT Id,
         Name1,
         ZipCode,
         StreetName,
         StreetNumber,
         State1,
         Lat,
         Lng,
         Keyword,
         ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance 
      FROM Business_Details 
      )
      WHERE (distance < 1.5) and (Keyword like '%plumber%')  
       ORDER BY distance  ; 
      

      【讨论】:

      • 感谢您的回复在这篇特定的文章 code.google.com/apis/maps/articles/phpsqlsearch.html 他们使用了以下查询,其中包含有和 order by 子句,他们正在使用 mysql 服务器我正在使用 sql server 2005 查询 SELECT id 是否有任何区别,(3959 * acos(cos(弧度(37))* cos(弧度(lat))* cos(弧度(lng)-弧度(-122)) + sin( 弧度 (37) ) * sin( 弧度( lat ) ) ) ) 与标记的距离 HAVING distance
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      相关资源
      最近更新 更多