在表达式中使用同一个表中的两个不同的行

时间:2012-10-15 07:13:16

标签: postgresql postgis

我正在使用PostgreSQL + PostGIS。

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

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表中取出它。我的问题是我不知道如何同时处理来自一个表的两个不同行的数据。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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的答案所示;
  • 使用window function lag()lead()获取相对于查询结果中当前行的行;或
  • JOIN在返回表的子查询

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