PostGIS에서 고유 ID로 뷰를 만들 수 있습니까?


24

PostGIS에서 뷰를 만들 때 해당 뷰에 고유 ID를 추가 할 수있는 방법이 있습니까? 다른 PostGIS 테이블의 "gid"필드처럼?

편집 : 원본 게시물에 이것을 포함시켜야합니다. PostGresql 9.0 및 PostGIS 1.5를 사용하고 있습니다.

안도

답변:


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을 포함한 대부분의 데이터베이스에서 작동합니다.


쿨-나는 그것을 전에주고 다시 연락 드리겠습니다.
Ando

3
당신은 또한 열 이상 row_number() OVER() AS "id"없이 할 수 있습니다 ORDER
falcacibar

이는 사실상 임의의 값 과 마찬가지로 일반적으로 매우 잘못된 설계 결정 row_number입니다. SELECT특히 기본 데이터가 변경 될 때 사이에 일관성이 있는지에 의존 할 수 없습니다 .
jpmc26

@jpmc-본질적으로 기본 데이터가 변경되면 뷰가 변경됩니다. 신뢰할 수있는 ID는 질문 요구 사항의 일부가 아닙니다. 일부 GIS는 레이어를로드하기 위해 각 기능 (예 : ArcMap)에 대해 고유 한 ID가 필요합니다.
geographika

일치하지 않는 ID로 ArcMap이 제대로 작동한다고 믿지 않습니다. 속성 테이블을 이동하지만 새로 고치지 않을 때 데이터베이스를 다시 쿼리하지 않는 방법을 어떻게 알 수 있습니까? 그런 다음 기능을 선택하려고 할 때 일치하지 않습니다.
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;

나는 아직 이러한 제안을 시도하기 위해 일을하지 않았습니다. 그러나 제안한 해결책은 이것이 Postgresql 버전 <= 8.3에 대해서만입니까? Postresql 9.0 및 PostGIS 1.5를 실행 중입니다.
Ando

1
시스템의 경우 이와 geographika의 대답이 모두 작동합니다. 어느 것이 더 빠른지 확인하는 것이 좋은 성능 테스트입니다. QGIS에서 데이터를 보려면 질문에서 요청한 것을 수행해야 했으므로 비슷한 상황에 처해있는 것 같습니다.
Mike T

1
동일한 상황-말할 때 몇 개의 레이어를 결합하려고 시도하고 QGIS에 고유 한 ID가 필요합니다.
Ando
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.