在PostGIS中可以创建具有唯一ID的视图吗?


24

当我在PostGIS中创建视图时,是否可以向该视图添加唯一ID?就像其他PostGIS表中的“ gid”字段一样吗?

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

安藤

Answers:


29

您应该能够将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。


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

3
您也可以 row_number() OVER() AS "id"不设置ORDER过多列
falcacibar

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

@jpmc-就其本质而言,如果基础数据发生变化,则视图也会发生变化。可靠的ID并非问题要求的一部分。某些GIS仅为加载图层(例如ArcMap)而为每个功能要求唯一的ID。
geographika

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

5

对于旧版本的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。
安藤

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

1
我会说相同的情况-试图在视图中合并几层,并要求QGIS具有唯一的ID。
安藤
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.