簡體   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