编辑:对不起,我应该在原始文章中包含此内容。我正在使用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。
#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
评论
太酷了-我会尽快给您,然后回覆您。
–安藤
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