Trong PostGIS, bạn có thể tạo Chế độ xem bằng ID duy nhất không?


24

Khi tôi tạo chế độ xem trong PostGIS, có cách nào để thêm ID duy nhất vào chế độ xem đó không? Cũng giống như trường "gid" trong bất kỳ bảng PostGIS nào khác?

Chỉnh sửa: Xin lỗi tôi nên đã bao gồm điều này trong bài viết gốc. Tôi đang sử dụng PostGresql 9.0 và PostGIS 1.5.

Ando

Câu trả lời:


29

Bạn sẽ có thể sử dụng hàm row_number () làm cột trong chế độ xem của mình. Điều này hoạt động cho Postgres 8.4 trở lên.

http://www.postgresql.org/docs/civerse/static/fifts-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

Điều này sẽ hoạt động trong hầu hết các cơ sở dữ liệu bao gồm SQL Server, Oracle và MySQL.


Thật tuyệt - Tôi sẽ đưa nó trước đây và lấy lại cho bạn.
Ando

3
Bạn cũng có thể làm row_number() OVER() AS "id"mà không cần ORDERqua cột
falcacibar

Đây thường là một quyết định thiết kế rất kém, vì thực sự row_numberlà một giá trị ngẫu nhiên. Bạn không thể phụ thuộc vào sự thống nhất giữa SELECTcác s, đặc biệt khi dữ liệu cơ bản thay đổi.
jpmc26

@jpmc - về bản chất, chế độ xem sẽ thay đổi nếu dữ liệu cơ bản của nó thay đổi. ID đáng tin cậy không phải là một phần của yêu cầu câu hỏi. Một số GIS chỉ cần một ID duy nhất cho mỗi tính năng chỉ để tải lớp (ví dụ ArcMap).
địa lý

Tôi sẽ không tin tưởng ArcMap để hoạt động đúng với ID không nhất quán. Làm thế nào để bạn biết nó không yêu cầu cơ sở dữ liệu khi bạn pan nhưng không làm mới bảng thuộc tính? Sau đó, bạn sẽ có một sự không phù hợp khi cố gắng chọn các tính năng.
jpmc26

5

Đối với các phiên bản cũ hơn của PostgreSQL (<= 8.3), đây là một giải pháp khác. Trong ví dụ này, tôi sử dụng tên cột khác vidcho "ID xem".

Đầu tiên, tạo một chuỗi. Sử dụng CYCLEđể nó sẽ lặp trong trường hợp bạn đạt đến cuối chuỗi.

CREATE SEQUENCE myview_vid_seq CYCLE;

Bây giờ, tạo VIEW sử dụng chuỗi:

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

Tôi chưa trở lại làm việc để thử những gợi ý này. Nhưng giải pháp bạn đã đề xuất là chỉ dành cho phiên bản Postgresql <= 8.3? Tôi đang chạy Postresql 9.0 và PostGIS 1.5.
Ando

1
Đối với hệ thống của bạn, cả câu trả lời này và câu trả lời của geographika đều hoạt động. Nó sẽ là một bài kiểm tra hiệu suất tốt để xem cái nào nhanh hơn. Tôi đã phải làm những gì bạn hỏi trong câu hỏi của bạn để xem dữ liệu trong QGIS, vì vậy tôi đoán bạn đang ở trong tình huống tương tự.
Mike T

1
Tình huống giống hệt tôi sẽ nói - Cố gắng kết hợp một vài lớp trong chế độ xem và yêu cầu một id duy nhất cho QGIS.
Ando
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.