Saya belajar PostgreSQL dan mencoba mencari cara untuk membuat tabel sementara atau WITH
deklarasi yang dapat digunakan sebagai pengganti tabel biasa, untuk keperluan debugging.
Saya melihat dokumentasi untuk CREATE TABLE dan katanyaVALUES
bisa digunakan sebagai query tetapi tidak memberikan contoh; dokumentasi untuk VALUES
klausa yang ditautkan di dalamnya juga tidak memiliki contoh?
Jadi, saya menulis tes sederhana sebagai berikut:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Tapi PostgreSQL (9.3) mengeluhkan
kesalahan sintaks di atau dekat "AS"
Pertanyaan saya adalah:
Bagaimana saya bisa memperbaiki pernyataan di atas?
Bagaimana saya bisa menyesuaikannya untuk digunakan dalam
WITH block
?
Terima kasih sebelumnya.
postgresql
syntax
tinlyx
sumber
sumber
Jawaban:
EDIT: Saya meninggalkan jawaban asli yang diterima apa adanya, tetapi harap perhatikan bahwa edit di bawah ini, seperti yang disarankan oleh a_horse_with_no_name, adalah metode yang disukai untuk membuat tabel sementara menggunakan VALUES.
Jika Anda hanya ingin memilih dari beberapa nilai, bukan hanya membuat tabel dan memasukkannya, Anda dapat melakukan sesuatu seperti:
Untuk benar-benar membuat tabel sementara dengan cara yang serupa, gunakan:
EDIT: Seperti yang ditunjukkan oleh a_horse_with_no_name, dalam dokumen itu menyatakan bahwa
CREATE TABLE AS...
secara fungsional mirip denganSELECT INTO ...
, tetapi yang pertama adalah superset dari yang terakhir dan yangSELECT INTO
digunakan dalam plpgslq untuk menetapkan nilai ke variabel sementara - sehingga akan gagal dalam kasus itu. Oleh karena itu, sementara contoh di atas berlaku untuk SQL biasa,CREATE TABLE
formulir harus lebih disukai.Catatan, juga dari komentar oleh a_horse_with_no_name, dan dalam pertanyaan awal OP, ini termasuk pemeran untuk tipe data yang benar di dalam daftar nilai dan menggunakan pernyataan CTE (WITH).
Juga, sebagaimana ditunjukkan dalam jawaban Evan Carrol, permintaan CTE adalah pagar pengoptimalan , yaitu, CTE selalu terwujud. Ada banyak alasan bagus untuk menggunakan CTE, tetapi bisa ada pencapaian kinerja yang cukup signifikan, jika tidak digunakan dengan hati-hati. Namun, ada banyak contoh di mana pagar pengoptimalan sebenarnya dapat meningkatkan kinerja, jadi ini adalah sesuatu yang harus diperhatikan, bukan untuk dihindari secara membabi buta.
sumber
WHERE ST_Intersects(geom, (SELECT geom FROM sometable)
atauWHERE ST_Intersects(geom, ST_Buffer(anothergeom, 10)
sering perencana kueri tidak menggunakan indeks spasial karena kolom geom tidak lagi dapat ditagih. Jika Anda membuat bidang yang Anda minati dalam CTE awal, masalah ini akan hilang. Ini juga sangat nyaman, jika Anda ingin menggunakan aoi yang sama dalam beberapa ekspresi lebih lanjut dalam kueri yang sama, yang tidak biasa dalam konteks GIS.create table as
membutuhkan pernyataan pilih:Anda juga dapat menulis ulang ini untuk menggunakan CTE:
sumber
Masalahnya adalah tipe data. Jika Anda menghapusnya, pernyataan itu akan berfungsi:
Anda dapat menentukan tipe dengan melemparkan nilai-nilai dari baris pertama:
sumber
Anda benar-benar tidak perlu membuat tabel atau menggunakan CTE, jika yang Anda butuhkan hanyalah menggunakan beberapa nilai dalam kueri Anda. Anda dapat mengikutinya:
Kemudian Anda bisa mendapatkan produk Cartesian dengan
CROSS JOIN
(di mana hubungan lainnya bisa, tentu saja, tabel biasa, tampilan, dll.). misalnya:yang menghasilkan:
Atau
JOIN
nilai-nilai dengan hubungan lain (yang lagi-lagi bisa berupa tabel, tampilan, dll.), Misalnya:yang menghasilkan:
sumber
Pertama selalu menggunakan standar
CREATE TABLE AS
,SELECT INTO
seperti yang disarankan dalam jawaban lain telah menjadi sintaks yang sudah usang selama lebih dari satu dekade. Anda dapat menggunakannyaCREATE TABLE AS
dengan CTESementara banyak jawaban di sini menyarankan menggunakan CTE, itu tidak disukai. Bahkan, sepertinya agak lambat. Hanya membungkusnya sebagai meja.
Jika Anda harus menulis pernyataan pilih, Anda juga dapat melakukannya (dan Anda tidak memerlukan CTE).
CTE di PostgreSQL memaksa materialisasi. Ini adalah pagar optimasi. Untuk alasan itu, umumnya bukan ide yang baik untuk menggunakannya di mana saja kecuali ketika Anda memahami biayanya dan Anda tahu itu untuk memberikan peningkatan kinerja. Anda dapat melihat lambatnya di sini, misalnya,
sumber
sumber