【问题标题】:Sqlite generate distance table from point informationSqlite根据点信息生成距离表
【发布时间】:2015-08-04 04:42:06
【问题描述】:

我有一个包含几个点坐标的表格。

| PointName | XCoor | YCoor |
+-----------+-------+-------+
|    P1     |  X1   |  Y1   |
+-----------+-------+-------+
|    P2     |  X2   |  Y2   |
+-----------+-------+-------+
....

我想生成一个包含两点之间距离的表格。

| Point1Name | Point2Name | Distance |
+------------+------------+----------+
|    P1      |    P2      |  ZZZZZ   |
+------------+------------+----------+
....

为了能够计算两点之间的距离,我启用了动态扩展加载并使用extension-functions module 进行算术计算。但是,我不太确定是否可以使用任何类型的 SQL 技巧创建输出表?

我在 C++ 程序中需要这种功能,所以在最坏的情况下,我会尝试以 C++ 方式而不是使用 SQL 语句来实现。但是,这将要求我使用 sqlite3_exec() 并定义我的回调函数,并且很可能我最终会在第一个回调函数中运行另一个 sqlite3_exec() 以获得所需的输出。

提前致谢

【问题讨论】:

    标签: c++ sql sqlite


    【解决方案1】:

    这个 SQL 应该为你生成一个表:

    create table distances as
    select a.PointName as Point1Name, b.PointName as Point2Name,
      sqrt((a.XCoor - b.XCoor) * (a.XCoor - b.XCoor) + (a.YCoor - b.YCoor) * (a.YCoor - b.YCoor)) as Distance
    from points a, points b
    where a.rowid != b.rowid
    

    您真的需要将它放在桌子上吗?当您想要获取值时,您可以只执行 select 语句。

    【讨论】:

    • 谢谢!我会将这张表用于另一个操作,所以我最好将它存储在数据库中,而不是每次都运行查询!
    【解决方案2】:
    SELECT
       a.PointName AS Point1Name,
       b.PointName AS Point2Name, 
       POWER(POWER(a.xCoor - b.xCoor, 2) + POWER(a.yCoor - b.yCoor, 2), 1 / 2) AS Distance
    FROM
       Points a, Points b
    WHERE
       a.PointName <> b.PointName
    ;
    

    每个距离会有两次(p1 p2 和 p2 p1)

    【讨论】:

    • 哇,sqlite真的没有power功能,可以在oracle,mysql等中使用。
    • (所以只有另一个答案是正确的,我不知道这个是否应该留在这里以供人们使用其他 dbms 找到它或删除它)
    • 你的答案和我的一样正确——他使用的扩展库有一个power 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多