Saya sangat baru menggunakan PostGIS, PostgreSQL, dan SQL secara umum.
Saya memiliki 44 tabel dalam database PostGIS saya, dan masing-masing mewakili lapisan data vektor yang berbeda. Masing-masing dimuat dari shapefile terpisah, dan masing-masing memiliki kolom yang menggambarkan geometri untuk lapisan itu, yang disebutwkb_geometry
Saya ingin memilih poligon tertentu pada satu lapisan, dan kemudian mengambil SEMUA geometri dari subset lapisan yang tumpang tindih dengan kotak pembatas poligon itu. Saya tidak merasa pilih-pilih tentang urutan yang keluar, tetapi akan sangat membantu jika diatur oleh tabel dari masing-masing kelompok geometri.
Berikut ini contoh pernyataan SQL saya:
SELECT
ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
table2, table3, table4, table5
WHERE
wkb_geometry &&
(
SELECT
wkb_geometry
FROM
table1
WHERE
ogc_fid = 25
);
yang mengembalikan kesalahan:
column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */
Apa cara yang tepat untuk melakukan ini?
Jawaban:
pertama-tama Anda mendapatkan pesan kesalahan ini, karena Anda tidak menentukan dari tabel mana Anda ingin memilih kolom geometri (dan karena mereka semua memiliki nama yang sama, postgres semakin bingung). Itu sebabnya Anda mendapatkan pesan kesalahan
Jika Anda memiliki nama kolom yang sama di beberapa tabel selalu tambahkan nama tabel di depan nama kolom: mis. table1.wkb_geometry
Untuk kueri Anda: Jika saya memahami Anda dengan benar, Anda ingin menemukan objek dalam lapisan berbeda yang memotong objek tertentu dalam satu lapisan tertentu.
Mulailah melihat dua tabel sekaligus di awal untuk membuatnya sederhana:
Table1 adalah tabel dengan objek tertentu, table2 tabel dengan objek lain
Sekarang, jika Anda ingin menambahkan objek tambahan dari tabel lain, Anda perlu UNION ALL, seperti yang sudah disebutkan oleh Sasa. Nama kolom tidak harus sama, tetapi jumlah kolom dan tipe data!
Anda mungkin mendapatkan masalah, membuka kueri di penampil, karena tidak ada ID unik. Cara sederhana untuk menyelesaikan ini adalah menyimpan hasilnya sebagai tabel dengan kolom id.
Selamat bersenang-senang
sumber
Saya tidak memiliki klien SQL di depan saya jadi ini mungkin tidak 100% akurat, tetapi Anda akan menginginkan sesuatu seperti:
dan seterusnya. Masalah Anda adalah bahwa kueri sql tidak tahu tabel apa (table2 / 3/4/5) yang Anda maksud ketika Anda menentukan SELECT ST_AsEWKT (wkb_geometry), sehingga referensi yang ambigu. Anda dapat menambahkan ORDER BY ke hasil juga jika Anda ingin mereka memesan
sumber