ใน PostGIS เป็นไปได้ไหมที่จะสร้างมุมมองด้วย ID ที่ไม่ซ้ำใคร


24

เมื่อฉันสร้างมุมมองใน PostGIS มีวิธีใดที่จะเพิ่ม ID เฉพาะลงในมุมมองนั้น เช่นเดียวกับฟิลด์ "gid" ในตาราง PostGIS อื่น ๆ

แก้ไข:ขออภัยฉันควรรวมไว้ในโพสต์ต้นฉบับ ฉันใช้ PostGresql 9.0 และ PostGIS 1.5

Ando

คำตอบ:


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 - โดยธรรมชาติแล้วมุมมองจะเปลี่ยนหากข้อมูลพื้นฐานเปลี่ยนแปลง รหัสที่เชื่อถือได้ไม่ใช่ส่วนหนึ่งของข้อกำหนดของคำถาม GIS บางตัวต้องการ ID เฉพาะสำหรับแต่ละคุณสมบัติเพื่อโหลดเลเยอร์ (เช่น ArcMap)
geographika

ฉันจะไม่เชื่อใจ ArcMap ให้ทำงานอย่างถูกต้องกับ ID ที่ไม่สอดคล้องกัน คุณจะรู้ได้อย่างไรว่ามันไม่ต้องการสอบถามฐานข้อมูลเมื่อคุณเลื่อน แต่ไม่รีเฟรชตารางแอตทริบิวต์ จากนั้นคุณจะมีความไม่ตรงกันในการเลือกคุณสมบัติ
jpmc26

5

สำหรับ PostgreSQL รุ่นเก่ากว่า (<= 8.3) นี่เป็นอีกวิธีการหนึ่ง ในตัวอย่างนี้ฉันใช้ชื่อคอลัมน์อื่นvidสำหรับ "ดู ID"

ขั้นแรกสร้างลำดับ ใช้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
Ando

1
สำหรับระบบของคุณทั้งคำตอบนี้และคำตอบทางภูมิศาสตร์ควรใช้งานได้ดี มันจะเป็นการทดสอบประสิทธิภาพที่ดีเพื่อดูว่าอันไหนเร็วกว่า ฉันต้องทำสิ่งที่คุณถามในคำถามเพื่อดูข้อมูลใน QGIS ดังนั้นฉันเดาว่าคุณอยู่ในสถานการณ์ที่คล้ายคลึงกัน
Mike T

1
สถานการณ์ที่เหมือนกันที่ฉันจะบอก - พยายามรวมเลเยอร์สองสามรายการในมุมมองและต้องการรหัสเฉพาะสำหรับ QGIS
Ando
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.