我在Oracle中编写一个SQL查询,如下所示:
SELECT * FROM ( SELECT testid,max(decode(name,'longitude',stringvalue,NULL)) as longitude,'latitude',NULL)) as latitude FROM test_av GROUP BY testid ) av INNER JOIN ( SELECT id,((ACOS( SIN(16.15074 * 3.141592653 / 180) * SIN(latitude * 3.141592653 / 180) + COS(16.15074 * 3.141592653 / 180) * COS(latitude * 3.141592653 / 180) * COS((-22.74426 - longitude)*3.141592653 / 180) )*6373)) as distance FROM test ) t ON t.id = av.testid WHERE t.distance <= 100
解决方法
如果我正确理解你想要做什么,你实际上并不需要INNER JOIN,因为你没有从测试中获取任何真实的信息,而这些信息还没有在test_av上.所以,你可以写:
SELECT * FROM ( SELECT id,longitude,latitude,((ACOS( SIN(16.15074 * 3.141592653 / 180) * SIN(latitude * 3.141592653 / 180) + COS(16.15074 * 3.141592653 / 180) * COS(latitude * 3.141592653 / 180) * COS((-22.74426 - longitude) * 3.141592653 / 180) )*6373)) AS distance FROM ( SELECT testid AS id,NULL)) as latitude FROM test_av GROUP BY testid ) ) WHERE distance <= 100 ;
如果你想明确地确保你只获得测试中存在的记录 – 也就是说,如果你在test_av中有没有测试父项的记录,并且你想要过滤那些 – 那么你可以在最里面处理子查询,在您的FROM test_av之后.