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;