1

我正在使用 PostgreSQL + PostGIS。

在表中,我在同一张表的同一列中的不同行中有一个点和线几何。要获得我运行的线路:

SELECT the_geom
FROM filedata
WHERE id=3

如果我想采取行动,我会运行:

SELECT the_geom
FROM filedata
WHERE id=4

我想把点和线放在一起,就像它们在这个 WITH 表达式中显示的那样,但是使用对表的真实查询来代替:

WITH data AS (
SELECT 'LINESTRING (50 40, 40 60, 50 90, 30 140)'::geometry AS road,
       'POINT (60 110)'::geometry AS poi)

SELECT ST_AsText(
ST_Line_Interpolate_Point(road, ST_Line_Locate_Point(road, poi))) AS projected_poi

FROM data;

您在此示例中看到数据来自手动创建的 WITH 表达式。我想把它从我的filedata桌子上拿走。我的问题是我不知道如何同时处理来自一张表的两个不同行的数据。

4

2 回答 2

3

一种可能的方法:
从不同行检索另一个值的子查询。

SELECT ST_AsText(
          ST_Line_Interpolate_Point(
             the_geom
            ,ST_Line_Locate_Point(
                the_geom
               ,(SELECT the_geom FROM filedata WHERE id = 4)
             )
          )
       ) AS projected_poi
FROM   filedata
WHERE  id = 3;
于 2012-10-15T07:43:53.617 回答
2

使用自联接:

SELECT ST_AsText(
  ST_Line_Interpolate_Point(fd_road.the_geom, ST_Line_Locate_Point(
      fd_road.the_geom,
      fd_poi.the_geom
  )) AS projected_poi
FROM filedata fd_road, filedata fd_poi
WHERE fd_road.id = 3 AND fd_poi.id = 4;

正如 Erwin 所指出的,交替使用子查询来获取另一行。

在单个表达式中使用一个表中的多行的主要选项是:

  • 如上所示,使用两个不同的别名自连接表,然后过滤行;
  • 正如 Erwin 的回答所示,使用子查询表达式获取除一行之外的所有行的值;
  • 使用类似and的窗口函数在查询结果中获取相对于当前行的行;或者lag()lead()
  • JOIN在返回表的子查询上

后两个是更高级的选项,可以解决使用更简单的自联接或子查询表达式难以解决或效率低下的问题。

于 2012-10-15T07:34:33.667 回答