通过SQL查询子查询数据

时间:2016-04-22 20:33:33

标签: mysql sql

我有以下查询, 查询西经(LONG_W)中STATION中最大北纬度(LAT_N)小于137.2345 137.2345。将你的答案四舍五入到小数点后。 表STATION的模式是id,city,state,lat_N,long_w

这是我的代码,

SELECT LONG_W 
FROM STATION 
WHERE LAT_N IN
(SELECT ROUND(MAX(LAT_N), 4) FROM STATION WHERE LAT_N < 137.2345);

这不起作用,我在这里做错了什么。

7 个答案:

答案 0 :(得分:1)

这里有几个问题。

首先,不能保证LAT_N中的值等于ROUND(LAT_N,4)。

 78.123456 = ROUND(78.123456,4)   --> FALSE

我认为不需要子查询。

纬度的最大值(以度为单位)将为90.我认为问题是要求LONG_W的值小于137.2345

我把这个问题看作是指定......

  • 访问电台表格中的行
  • 排除不满足LONG_W&lt;的行137.2345
  • 从这些行中找到“最大”值LAT_N
  • 将LAT_N的最大值舍入到4位小数
  • 返回舍入值

我会写这样的查询:

 SELECT ROUND(MAX(s.lat_n),4) AS largest_lat_n
    FROM station s
   WHERE s.long_w < 137.2345

也许我正在读错的问题。 (这不是SQL问题,这是规范问题。)

如果问题是提问......

  • 访问电台表格中的行
  • 排除不满足LONG_W&lt;的行137.2345
  • 从这些行中找到具有“最大”值LAT_N
  • 的行
  • 从具有最大LAT_N
  • 的那一行获取LONG_W
  • 将LONG_W舍入到4位小数
  • 返回舍入值

要在具有最大LAT_N的行上获取其他值,我可以执行以下操作:

  SELECT ROUND(s.long_w,4)
    FROM station s
   WHERE s.long_w < 137.2345
   ORDER BY s.lat_n DESC
   LIMIT 1

如果我想使用子查询,我们可能会使用相同的LAT_N获得多行,并且其中一些LONG_W值可能大于137.2345

考虑一个包含值为:

的行的表
LAT_N     LONG_W
-------   ---------
87.654321 131.313131
87.654321 140.404040

...并假设87.654321的值是LONG_W&lt;行的“最大”值。 137.2345。 (也就是说,没有其他行具有更大的LAT_N。)

考虑这句话的回报:

 SELECT t.long_w
   FROM ( SELECT MAX(s.lat_n) AS largest_lat_n
            FROM station s
           WHERE s.long_w < 137.2345
        ) s
   JOIN station t
     ON t.lat_n = s.largest_lat_n

这将返回行的两个。如果我们执行MAX()函数,我们将返回更高的值140.4040404值。这似乎与规范不符。为了防止返回更大的LONG_W值,我们需要在查询中添加谓词(WHERE子句中的条件)

  WHERE t.long_w < 137.2345

或者,我们可以使用SELECT列表中的表达式来过滤掉不符合规范的LONG_W值

 SELECT MAX( IF(t.long_w<137.2345,t.long_w,NULL) ) AS long_w

答案 1 :(得分:0)

从STATION中选择TRUNCATE(SUM(LAT_N),4) LAT_N> 38.7880并且LAT_N <137.2345;

答案 2 :(得分:0)

您应该ROUND这样检索的值:

Select ROUND(LONG_W,4) 
from STATION 
where LAT_N = (
    Select max(LAT_N) 
    from STATION where 
    LAT_N < 137.2345
);

答案 3 :(得分:0)

尝试一下。这很简单并且可以正常工作。

SELECT ROUND(LONG_W,4) 
FROM STATION 
WHERE LAT_N < 137.2345 
ORDER BY LAT_N DESC LIMIT 1;

答案 4 :(得分:0)

SELECT ROUND(MAX(LONG_W), 4)
  FROM STATION
 WHERE LAT_N IN(
           SELECT MAX(LAT_N)
           FROM STATION
           WHERE LAT_N < 137.2345
       );

答案 5 :(得分:0)

您可以使用Oracle运行以下代码。

SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE ROWNUM<2
AND LAT_N =(   
    SELECT MAX(LAT_N)
    FROM STATION WHERE LAT_N < 137.2345
);

答案 6 :(得分:-1)

我解决了这个挑战! 试试这个...

 SELECT ROUND(LONG_W, 4) 
    FROM STATION 
    WHERE LAT_N < 137.2345 
    ORDER BY LAT_N DESC 
    LIMIT 1;

这就是答案!用于 MySQL