在PostGIS中创建视图时,有什么方法可以向该视图添加唯一ID?就像其他PostGIS表中的“ gid”字段一样吗?

编辑:对不起,我应该在原始文章中包含此内容。我正在使用PostGresql 9.0和PostGIS 1.5。

Ando

#1 楼

您应该能够将row_number()函数用作视图中的一列。这适用于Postgres 8.4或更高版本。

http://www.postgresql.org/docs/current/static/functions-window.html

SELECT * FROM
( SELECT
    ROW_NUMBER() OVER (ORDER BY column_to_sort_by ASC) AS ROW_NUMBER,
    Col1, Col2
  FROM table_name
) myview_name


这应该在大多数数据库,包括SQL Server,Oracle和MySQL。

评论


太酷了-我会尽快给您,然后回覆您。

–安藤
11年7月16日在0:04

您也可以在不对列进行ORDER的情况下,以row_number()OVER()作为“ id”进行操作

–falcacibar
16年2月12日在17:43

这通常是一个非常糟糕的设计决策,因为row_number实际上是一个随机值。您不能依靠它在SELECT之间保持一致,尤其是当基础数据更改时。

– jpmc26
19年1月25日在1:38



@jpmc-就其本质而言,如果基础数据发生变化,则视图将发生变化。可靠的ID并非问题要求的一部分。某些GIS仅对每个要素都要求唯一的ID,以仅用于加载图层(例如ArcMap)。

– geoographika
19年1月25日在13:18

我不相信ArcMap在ID不一致的情况下可以正常运行。您如何知道平移而不刷新属性表时它不会重新查询数据库?然后,您在选择功能时会出现不匹配的情况。

– jpmc26
19年1月25日在15:02



#2 楼

对于旧版本的PostgreSQL(<= 8.3),这是另一种解决方案。在此示例中,我将另一个列名称vid用于“视图ID”。

首先,创建一个序列。使用CYCLE,以便在到达序列末尾时将循环播放。

CREATE SEQUENCE myview_vid_seq CYCLE;


现在,创建一个使用该序列的VIEW:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;


评论


我还没有回去尝试这些建议。但是您建议的解决方案是仅针对<= 8.3的Postgresql版本吗?我正在运行Postresql 9.0和PostGIS 1.5。

–安藤
2011年7月17日在2:53

对于您的系统,这和geographika的答案都应该起作用。看看哪个更快是一个很好的性能测试。为了查看QGIS中的数据,我不得不按照您的要求进行操作,因此我猜您处于类似情况。

– Mike T
2011年7月17日在4:59

我会说相同的情况-尝试在视图中合并几层,并要求QGIS具有唯一的ID。

–安藤
2011年7月17日在7:37