在没有窗口函数的情况下实现SQL查询

时间:2016-02-13 17:20:20

标签: sql sqlite

我已经读过,可以在SQL窗口函数中实现任何可能的功能,创建性地使用连接等,但我无法弄清楚如何。我在这个项目中使用SQLite,目前还没有窗口函数。

我有一个包含四列的表格:

CREATE TABLE foo (
   id INTEGER PRIMARY KEY,
   x REAL NOT NULL,
   y REAL NOT NULL,
   val REAL NOT NULL,
   UNIQUE(x,y));

和一个便利函数DIST(x1,y1,x2,y2)返回两点之间的距离。

我想要的是什么:对于该表中的每一行,我希望同一个表中的整行在一定距离内[例如25 km],最低的" val&#34 ;。对于具有相同" val"的行,我想使用最低距离作为平局。

我目前的解决方案是运行n + 1个查询,但是很有效:

SELECT * FROM foo;

...然后,对于返回的每一行,我运行[where" src"是我刚刚获得的那一行]:

SELECT * FROM foo
  WHERE DIST(foo.x, foo.y, src.x, src.y)<25
  ORDER BY val ASC, DIST(foo.x, foo.y, src.x, src.y) ASC
  LIMIT 1

但我真的想在一个查询中,部分是为了我自己的兴趣,部分是因为它使我更容易使用其他一些工具。

1 个答案:

答案 0 :(得分:0)

使用您的查询获取所需行的ID,然后使用它来加入表:

SELECT *
FROM (SELECT foo.*,
             (SELECT id
              FROM (SELECT id,
                           x,
                           y,
                           foo.x AS foo_x,
                           foo.y AS foo_y,
                           val
                    FROM foo)
              WHERE DIST(foo_x, foo_y, x, y) < 25
              ORDER BY val, DIST(foo_x, foo_y, x, y)
              LIMIT 1
             ) AS id2
      FROM foo)
JOIN foo AS foo2 ON id2 = foo2.id;