Чи можливо в PostGIS створити представлення з унікальним ідентифікатором?


24

Коли я створюю представлення в PostGIS, чи є спосіб додати унікальний ідентифікатор до цього подання? Так само, як поле "gid" у будь-якій іншій таблиці PostGIS?

Редагувати: Вибачте, що я повинен був включити це в оригінальний пост. Я використовую 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.


Класно - я дам це назад і повернуся до вас.
Андо

3
Ви також можете обійтися row_number() OVER() AS "id"без ORDERстовпця
falcacibar

Зазвичай це дуже погане дизайнерське рішення, оскільки row_numberце фактично випадкове значення. Ви не можете залежати від того, щоб він відповідав між SELECTs, особливо коли змінюються основні дані.
jpmc26

@jpmc - за своєю суттю погляд буде змінюватися, якщо змінити його основні дані. Надійний ідентифікатор не є частиною вимог до запитання. Деякі ГІС просто потребують унікального ідентифікатора для кожної функції просто для завантаження шару (наприклад, ArcMap).
geographika

Я б не довіряв ArcMap належним чином працювати з непослідовним ідентифікатором. Звідки ви знаєте, що вона не запитує базу даних, коли ви пануєте, але не оновлюєте таблицю атрибутів? Тоді у вас буде невідповідність, намагаючись вибрати функції.
jpmc26

5

Для старих версій PostgreSQL (<= 8,3), ось ще одне рішення. У цьому прикладі я використовую іншу назву стовпця vidдля "ідентифікатора перегляду".

Спочатку створіть послідовність. Використовуйте CYCLEтак, щоб він зациклювався на випадок, якщо ви досягнете кінця послідовності.

CREATE SEQUENCE myview_vid_seq CYCLE;

Тепер створіть ВИДІЛ, що використовує послідовність:

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.
Андо

1
У вашій системі повинні відповідати і ця, і відповідь географіки. Було б хорошим тестом на працездатність, щоб побачити, хто з них швидший. Мені довелося зробити те, що ви задаєте у своєму запитанні, щоб переглянути дані в QGIS, тому я здогадуюсь, що ви опинилися в подібній ситуації.
Майк Т

1
Ідентична ситуація, яку я б сказав - намагаюся поєднати кілька шарів у представленні та вимагати унікального ідентифікатора для QGIS.
Андо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.