Mysql Oracle圆距离搜索:缺少结果
编辑:如果你想看到老问题,请参阅此问题底部的 在你的帮助下,我修改了我的声明:Mysql Oracle圆距离搜索:缺少结果,mysql,oracle,oracle11g,Mysql,Oracle,Oracle11g,编辑:如果你想看到老问题,请参阅此问题底部的 在你的帮助下,我修改了我的声明: SELECT * FROM ( SELECT dest.ZC_ZIP, dest.ZC_LOCATION_NAME, ACOS( SIN(RADIANS(src.ZC_LAT)) * SIN(RADIANS(dest.ZC_LAT))
SELECT *
FROM (
SELECT
dest.ZC_ZIP,
dest.ZC_LOCATION_NAME,
ACOS(
SIN(RADIANS(src.ZC_LAT)) * SIN(RADIANS(dest.ZC_LAT))
+ COS(RADIANS(src.ZC_LAT)) * COS(RADIANS(dest.ZC_LAT))
* COS(RADIANS(src.ZC_LON) - RADIANS(dest.ZC_LON))
) * 6371 AS DISTANCE
FROM USER.ZC_COORDINATES dest
CROSS JOIN USER.ZC_COORDINATES src
WHERE src.ZC_ID =
(SELECT
ZC_ID
FROM USER.ZC_COORDINATES
WHERE ZC_ZIP = '64289'
GROUP BY ZC_ID
)
AND
(dest.ZC_ID <> src.ZC_ID OR dest.ZC_ID = src.ZC_ID)
)
HAVING DISTANCE <= 25 /* km */
ORDER BY DISTANCE;
CREATE OR REPLACE FUNCTION RADIANS(nDEGREES IN NUMBER)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN nDegrees / 57.29577951;
END RADIANS;
/
编译成功
现在,无分组错误的正确修改:
SELECT *
FROM (
SELECT
dest.ZC_ZIP AS ZIP,
dest.ZC_LOCATION_NAME AS LOCNAME,
calc_distance(src.ZC_LAT, src.ZC_LON, dest.ZC_LAT, dest.ZC_LON) AS DISTANCE
FROM BASE.ZC_COORDINATES dest
CROSS JOIN BASE.ZC_COORDINATES src
WHERE src.ZC_ID =
(SELECT
ZC_ID
FROM BASE.ZC_COORDINATES
WHERE ZC_ZIP = '64289'
GROUP BY ZC_ID
)
AND
(dest.ZC_ID <> src.ZC_ID OR dest.ZC_ID = src.ZC_ID)
)
HAVING DISTANCE <= 25 /* km */
GROUP BY ZIP, LOCNAME, DISTANCE;
--ORDER BY DISTANCE;
这是我从oracle系统得到的:
ZIP LOCNAME DISTANCE
64293 Darmstadt 0
64283 Darmstadt 0
64295 Darmstadt 0
64285 Darmstadt 0
64297 Darmstadt 0
64287 Darmstadt 0
64289 Darmstadt 0
64291 Darmstadt 0
你看,有些鲁尔特人不见了。
我认为问题在于oracle语句中的逐行分组,这是必需的。
所以我不能删除这一行。但是我怎样才能得到我的其他结果呢?我真的很困惑:
老问题
目前,我为我的员工编写了一个circle zip搜索程序。
我的工具在MySQL本地数据库上运行
现在,我成功地将OpenGeoDB迁移到oracle数据库中,并希望在本地MySQL数据库上运行我的sql语句
完整错误消息:
ORA-00904: "DISTANCE": invalid indentifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error in line: 20 col: 7
我的SQL语句:
SELECT
dest.zc_zip,
dest.zc_location_name,
ACOS(
SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat))
+ COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
* COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
) * 6371 as distance
FROM USER.ZC_COORDINATES dest
CROSS JOIN USER.ZC_COORDINATES src
WHERE src.zc_id =
(
SELECT zc_id
FROM USER.zip_coordinates
WHERE zc_zip = '64289' /* Platzhalter fuer PLZ */
GROUP BY zc_zip
)
AND (dest.zc_id <> src.zc_id OR dest.zc_id = src.zc_id)
HAVING distance <= 25 /* km */
ORDER BY distance;
我该怎么解决这个问题
我用完整的数学计算切换单词距离,但在此之后,Oracle调用无效的标识符弧度
这是我的问题,因为我不知道如何解决这个问题
有人有办法解决那个问题吗
谢谢。Oracle不允许您使用选择列表中按以下顺序计算的列。以下是合理的解决方法:
SELECT *
FROM (SELECT dest.ZC_ZIP,
dest.ZC_LOCATION_NAME,
ACOS(SIN(RADIANS(src.ZC_LAT)) * SIN(RADIANS(dest.ZC_LAT))
+ COS(RADIANS(src.ZC_LAT)) * COS(RADIANS(dest.ZC_LAT))
* COS(RADIANS(src.ZC_LON) - RADIANS(dest.ZC_LON))
) * 6371 AS DISTANCE
FROM USER.ZC_COORDINATES dest
CROSS JOIN USER.ZC_COORDINATES src
WHERE src.ZC_ID = (SELECT ZC_ID
FROM USER.ZIP_COORDINATES
WHERE ZC_ZIP = '64289'
GROUP BY ZC_ZIP) AND
(dest.ZC_ID <> src.ZC_ID OR
dest.ZC_ID = src.ZC_ID))
HAVING DISTANCE <= 25 /* km */
ORDER BY DISTANCE;
分享并享受。我对这个问题的最后一个答案和解决方案。 很抱歉后来的回答。做很多生意 非常感谢他们的帮助和经验 有什么问题 MySQL和Oracle语句之间的差异 使用Oracle SQL Developer从MySQL到Oracle的浮点数迁移问题 Oracle上不存在函数弧度 解决方案: 浮点数迁移: 要解决该问题,我需要执行以下操作: 使用phpMyAdmin PMA 1.SQL文件选择 2.只有数据导出,没有结构或其他东西 3.1行对应1个数据集 4.导入到oracle serv上的现有表中 缺少辐射功能: 使用以下语句:
SELECT *
FROM (
SELECT
dest.ZC_ZIP,
dest.ZC_LOCATION_NAME,
ACOS(
SIN(RADIANS(src.ZC_LAT)) * SIN(RADIANS(dest.ZC_LAT))
+ COS(RADIANS(src.ZC_LAT)) * COS(RADIANS(dest.ZC_LAT))
* COS(RADIANS(src.ZC_LON) - RADIANS(dest.ZC_LON))
) * 6371 AS DISTANCE
FROM USER.ZC_COORDINATES dest
CROSS JOIN USER.ZC_COORDINATES src
WHERE src.ZC_ID =
(SELECT
ZC_ID
FROM USER.ZC_COORDINATES
WHERE ZC_ZIP = '64289'
GROUP BY ZC_ID
)
AND
(dest.ZC_ID <> src.ZC_ID OR dest.ZC_ID = src.ZC_ID)
)
HAVING DISTANCE <= 25 /* km */
ORDER BY DISTANCE;
CREATE OR REPLACE FUNCTION RADIANS(nDEGREES IN NUMBER)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN nDegrees / 57.29577951;
END RADIANS;
/
SQL语句MySQL一:
SQL语句Oracle one:
谢谢你的快速回答。现在的问题是,oracle数据库调用我,他不知道函数Radians,称为无效标识符。我寻找任何解决方案,也许我找到了什么,如果找不到,我喊:DAdded弧度函数。分享和享受。谢谢你的帮助,我也解决了这个问题。但是我有一个新的,你可以在第一个条目上看到。我发现了错误,迁移不是100%正确。long和lang列中的浮点数为false。导入操作将删除这些点。我搜索一个解决方案来修复它,如果它不起作用,我会用一个答案来结束这个问题。问题解决了,我试着写答案,但为了得到一个更大的答案,结合项目符号列表和sql代码是行不通的。对于Oracle one,在11.1版中添加了函数calc_distance,用于精确计算距离。请记住,从距离到弧度的转换常数随纬度而变化。我使用了更精确的地球半径的平均值:dest.ZC_LAT>=src.ZC_LAT-circle/6371.4*180/3.1415926-如果可用,使用pi函数,dest.ZC_LAT=src.ZC_LON-circle/6371.4*180/3.1415926/cossrc.ZC_LAT*3.1415926/180和dest.ZC_LON thx@fl4l。如果我有更多的时间,我会用你的笔记编辑我的解决方案。谢谢你的建议。n2m
CREATE OR REPLACE FUNCTION RADIANS(nDEGREES IN NUMBER)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN nDegrees / 57.29577951;
END RADIANS;
/
SELECT
dest.zc_zip,
dest.zc_location_name,
ROUND(ACOS(
SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat))
+ COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
* COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
) * 6371,
1) as distance
FROM zip_coordinates dest
CROSS JOIN zip_coordinates src
WHERE src.zc_id =
(
SELECT zc_id
FROM zip_coordinates
WHERE zc_zip = '/zip/' /* placeholder for zip */
GROUP BY zc_zip
)
AND dest.zc_lat >= src.zc_lat -((/circle/-0.5)/111.045)
AND dest.zc_lat <= src.zc_lat +((/circle/-0.5)/111.045)
AND dest.zc_lon >= src.zc_lon -((/circle/-0.5)/(111.045 * COS(RADIANS(src.ZC_LAT))))
AND dest.zc_lon <= src.zc_lon +((/circle/-0.5)/(111.045 * COS(RADIANS(src.ZC_LAT))))
HAVING distance <= (/circle/-0.5) /* km */ /* placeholder for radius */
ORDER BY distance, dest.zc_zip;
SELECT *
FROM (
SELECT
dest.ZC_ZIP AS ZIP,
dest.ZC_LOCATION_NAME AS LOCNAME,
ROUND(
(6371* ACOS(
COS(RADIANS(dest.ZC_LAT))
* COS(RADIANS(src.ZC_LAT))
* COS(RADIANS(src.ZC_LON) - RADIANS(dest.ZC_LON))
+ SIN(RADIANS(dest.ZC_LAT))
* SIN(RADIANS(src.ZC_LAT))
)
), 1
) AS DISTANCE
FROM ORACLE_USER.ZC_COORDINATES dest
CROSS JOIN ORACLE_USER.ZC_COORDINATES src
WHERE src.ZC_ID =
(SELECT
ZC_ID
FROM ORACLE_USER.ZC_COORDINATES
WHERE ZC_ZIP = '/zip/'
GROUP BY ZC_ID
)
AND dest.ZC_LAT >= src.ZC_LAT -((/circle/-0.5)/111.045)
AND dest.ZC_LAT <= src.ZC_LAT +((/circle/-0.5)/111.045)
AND dest.ZC_LON >= src.ZC_LON -((/circle/-0.5)/(111.045 * COS(RADIANS(src.ZC_LAT))))
AND dest.ZC_LON <= src.ZC_LON +((/circle/-0.5)/(111.045 * COS(RADIANS(src.ZC_LAT))))
)
HAVING DISTANCE <= (/circle/-0.5) /* km */
GROUP BY ZIP, LOCNAME, DISTANCE
ORDER BY DISTANCE;