如何在同一个查询中多次使用 ORDER BY with LIMIT 1 语句?
How can I use the ORDER BY with LIMIT 1 statements multiple times in the same query?
我下载了 OpenStreetMap data from Geofabrik,我们可以在其中找到有关道路几何形状的信息。我知道如果我有一个随机点并且我需要查看离它最近的道路我可以在 PostgreSQL 上使用以下查询:
SELECT way, osm_id
FROM osm AS osm
ORDER BY osm.way <-> 'SRID=3857;POINT(-3890646.5744145643 -899377.0801662721)'::GEOMETRY LIMIT 1 ;
这里我硬编码了点POINT(-3890646.5744145643 -899377.0801662721)
。此查询有效,它 returns 结果:
它找出哪条路离我最近,并给了我这条路的osm_id。这里的问题是我想从不同的 table 获取点,在那里我将拥有多个点的几何形状,而不仅仅是一个点。由于此查询需要使用 LIMIT 1
才能工作。对于 different_table
上的每个点几何,我可以使用什么方法 运行 相同的查询?
我可以看到如何通过使用编程语言访问 PostgreSQL 来解决这个问题,因为我能够进行查询以从 different_table
获取所有文本点,然后循环遍历所有这些都是在使用我的第一个查询并一个一个地获得结果时进行的。但我不确定这是否是理想的解决方案。我想要一个只使用 PostgreSQL 的解决方案...我该怎么做?如何多次使用带有 LIMIT 1 语句的 ORDER BY 并为存在于不同 table 中的每个几何图形执行它(每行将是不同的点,如 'SRID=3857;POINT(-3890646.5744145643 -899377.0801662721)'::GEOMETRY
)?
您需要一个横向连接,它对另一行的每一行执行一次子查询table:
SELECT diff_id, way, osm_id, osm.way <-> diff_geog as distance
FROM different_table cross join lateral (
select way, osm_id from osm
ORDER BY osm.way <-> diff_geog LIMIT 1
) osm ;
我下载了 OpenStreetMap data from Geofabrik,我们可以在其中找到有关道路几何形状的信息。我知道如果我有一个随机点并且我需要查看离它最近的道路我可以在 PostgreSQL 上使用以下查询:
SELECT way, osm_id
FROM osm AS osm
ORDER BY osm.way <-> 'SRID=3857;POINT(-3890646.5744145643 -899377.0801662721)'::GEOMETRY LIMIT 1 ;
这里我硬编码了点POINT(-3890646.5744145643 -899377.0801662721)
。此查询有效,它 returns 结果:
它找出哪条路离我最近,并给了我这条路的osm_id。这里的问题是我想从不同的 table 获取点,在那里我将拥有多个点的几何形状,而不仅仅是一个点。由于此查询需要使用 LIMIT 1
才能工作。对于 different_table
上的每个点几何,我可以使用什么方法 运行 相同的查询?
我可以看到如何通过使用编程语言访问 PostgreSQL 来解决这个问题,因为我能够进行查询以从 different_table
获取所有文本点,然后循环遍历所有这些都是在使用我的第一个查询并一个一个地获得结果时进行的。但我不确定这是否是理想的解决方案。我想要一个只使用 PostgreSQL 的解决方案...我该怎么做?如何多次使用带有 LIMIT 1 语句的 ORDER BY 并为存在于不同 table 中的每个几何图形执行它(每行将是不同的点,如 'SRID=3857;POINT(-3890646.5744145643 -899377.0801662721)'::GEOMETRY
)?
您需要一个横向连接,它对另一行的每一行执行一次子查询table:
SELECT diff_id, way, osm_id, osm.way <-> diff_geog as distance
FROM different_table cross join lateral (
select way, osm_id from osm
ORDER BY osm.way <-> diff_geog LIMIT 1
) osm ;