【发布时间】:2011-09-14 15:29:57
【问题描述】:
我目前必须检查我的查询并将它们转移到使用 Oracle 而不是 SQLSERVER 并且我有点卡住这个查询,我正在使用来自 here 的查询
SELECT TOP 1 * FROM ( SELECT o.outcode AS lead_postcode, v.location,
v.location_name, v.outcode AS venue_postcode, 6371.0E *
( 2.0E *asin(case when 1.0E < (sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-
(RADIANS(CAST(v.lat AS FLOAT))))/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT)))
* cos(RADIANS(CAST(o.lat AS FLOAT))) * square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-
(RADIANS(CAST(v.lng AS FLOAT))))/2.0E))))) then 1.0E else
(sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-(RADIANS(CAST(v.lat AS FLOAT))))
/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT))) * cos(RADIANS(CAST(o.lat AS FLOAT)))
* square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-(RADIANS(CAST(v.lng AS FLOAT))))
/2.0E))))) end )) AS distance FROM venue_postcodes v, uk_postcodes o
WHERE o.outcode = @nrpostcode ) i WHERE distance<100 ORDER BY distance
现在我知道这是一个可怕的查询,但 Oracle 似乎遇到了很多问题。
首先它不喜欢6371E 中的E 和所有后续的E
其次,它不喜欢square 函数,所以我决定使用power 函数,但这仍然给了我错误。
第三,它不喜欢radians 函数
第四,它不喜欢 TOP 1 部分,所以我将其更改为在 WHERE 子句中使用 ROWNUM
我完全不知道在这里做什么。
关于我可以做些什么来使它工作的任何想法?
提前致谢
【问题讨论】:
-
从
horrible转置为decent。使用空格。分成几部分(也许是功能)。分别尝试每个功能 - 并为 Oracle 找到等效功能。分别尝试每个子句(如Top) - 并找到 Oracle 的等效子句。 -
我似乎无法找到
radians的替代品,也无法弄清楚为什么会出现E问题?网络上似乎没有太多关于 hasrsine 和 oracle 的内容 -
我认为,如果您想“正确地”执行此操作,您最好使用 Oracle 的 Spatial 扩展名并使用它的一个距离函数(我认为包括 Haversine)来存储您的位置。但恐怕我不是甲骨文专家。否则,删除那些“E”;它们不是必需的,并开始告诉我们您针对每个问题收到的确切错误消息。
-
@Matt Gibson - 我已经放弃了
E,我现在收到的错误是RADIANS - invalid identifier -
哦,至于弧度,请记住一个圆中有 2π 弧度,所以我认为您只需将度数除以大约 57.3 :) 但我个人会存储当我添加它们时,数据库中的纬度和经度也以弧度表示,以使这更容易和更快......
标签: sql sql-server oracle haversine