繁体   English   中英

SQL UNION无法使用2个HAVING子句

[英]SQL UNION not working with 2 HAVING clauses

我想使用UNION联接两个SQL SELECT查询。 我需要最终数据以使用HAVING子句来过滤整个查询。 这是我的声明:

SELECT CLIENT, 
       BIZNAME, 
       BIZSTREET, 
       BIZCITY, 
       BIZSTATE, 
       BIZZIP, 
       BIZPHONE, 
       URL, 
       LAT, 
       LNG, 
       CONSOLIDATED, 
       ( 3959 * ACOS(COS(RADIANS('%s')) * COS(RADIANS(LAT)) * COS( 
                     RADIANS(LNG) - RADIANS('%s')) 
                              + SIN 
                              (RADIANS('%s')) * SIN(RADIANS(LAT))) ) AS distance 
FROM   BizInfo 
       INNER JOIN WebSites 
               ON WebSites.CUSTOMER = BizInfo.CUSTOMER 
WHERE  BizInfo.CLIENT = 'GCB' 
       AND WebSites.STATUS <> 'Cancel' 
       AND WebSites.STATUS <> 'In Progress' 
       AND WebSites.STATUS <> 'Review' 
       AND WebSites.STATUS <> 'Testing' 
UNION 
SELECT CLIENT, 
       BIZNAME, 
       BIZSTREET, 
       BIZCITY, 
       BIZSTATE, 
       BIZZIP, 
       BIZPHONE, 
       'http://www.abc-site.com', 
       LAT, 
       LNG, 
       '0', 
       ( 3959 * ACOS(COS(RADIANS('%s')) * COS(RADIANS(LAT)) * COS( 
                     RADIANS(LNG) - RADIANS('%s')) 
                              + SIN 
                              (RADIANS('%s')) * SIN(RADIANS(LAT))) ) AS distance 
FROM   BizInfo 
WHERE  CLIENT = 'GCB' 
       AND BIZNAME = 'Acme' 
HAVING DISTANCE < '%s' 
ORDER  BY DISTANCE 
LIMIT 0, 200 

我在此网站上阅读了http://www.really-fine.com/SQL_union.html(GROUP BY和HAVING子句只能在单个查询中使用,而不能用于影响最终结果集。),但是我不会不了解如何实施此方法或该方法是否正确。

如何正确编写此SQL查询?

HAVING只能在带有GROUP BY子句的聚合查询中使用。 您的查询没有。 请改用WHERE。

  1. 这些是标量函数,而不是聚合函数。 因此,要过滤结果,请使用WHERE子句,而不要使用HAVING子句。 您正在水平过滤,而不是垂直过滤。

  2. 您不能在WHERE子句中使用列别名,因此必须重新声明SELECT列表中使用的函数(我在下面的查询中已完成此操作)。

尝试以下方法。 有2个问题在起作用。

SELECT Client,
       BizName,
       BizStreet,
       BizCity,
       BizState,
       BizZip,
       BizPhone,
       url,
       lat,
       lng,
       Consolidated,
       (3959 * acos(cos(radians('%s')) * cos(radians(lat)) *
                    cos(radians(lng) - radians('%s')) +
                    sin(radians('%s')) * sin(radians(lat)))) AS distance
  FROM BizInfo
 INNER JOIN WebSites
    ON WebSites.Customer = BizInfo.Customer
 WHERE BizInfo.Client = 'GCB'
   AND WebSites.Status <> 'Cancel'
   AND WebSites.Status <> 'In Progress'
   AND WebSites.Status <> 'Review'
   AND WebSites.Status <> 'Testing'
UNION
SELECT Client,
       BizName,
       BizStreet,
       BizCity,
       BizState,
       BizZip,
       BizPhone,
       'http://www.abc-site.com',
       lat,
       lng,
       '0',
       (3959 * acos(cos(radians('%s')) * cos(radians(lat)) *
                    cos(radians(lng) - radians('%s')) +
                    sin(radians('%s')) * sin(radians(lat)))) AS distance
  FROM BizInfo
 WHERE Client = 'GCB'
   AND BizName = 'Acme'
   and (3959 * acos(cos(radians('%s')) * cos(radians(lat)) *
                    cos(radians(lng) - radians('%s')) +
                    sin(radians('%s')) * sin(radians(lat)))) < '%s'
 ORDER BY distance LIMIT 0, 200

您可以通过将所有内容包装到子查询中来轻松解决该问题。 就像是 :

SELECT
  *
FROM
  (
      SELECT Client, BizName, BizStreet, BizCity, BizState, BizZip, BizPhone, url, lat, lng, Consolidated,
      ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) )
      AS distance FROM BizInfo
      INNER JOIN WebSites ON WebSites.Customer = BizInfo.Customer
      WHERE BizInfo.Client = 'GCB'
      AND WebSites.Status <> 'Cancel' AND WebSites.Status <> 'In Progress' AND WebSites.Status <> 'Review' AND WebSites.Status <> 'Testing' 
      UNION SELECT Client, BizName, BizStreet, BizCity, BizState, BizZip, BizPhone, 'http://www.abc-site.com', lat, lng, '0', 
      ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) )
      AS distance FROM BizInfo WHERE Client = 'GCB' AND BizName = 'Acme'
  ) AS ClientInfo
WHERE 
  distance < '%s' 
ORDER BY 
  distance 
LIMIT 0 , 200

这是您想要的最快途径,但不是很干净。

还请告诉我,所有这些参数都不易受到SQL注入的影响 ...?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM