PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Di psql bagaimana menjalankan Loop untuk kueri Select dengan CTE dan mendapatkan output yang ditampilkan jika saya menjalankannya dalam read-only db?

Jika saya menguraikan ini dengan benar, Anda pada dasarnya ingin memilih semua orang di mana nomor baris menurut ID turun muncul di alamat. Hasil akhir kemudian harus dibatasi pada nomor baris tertentu.

Maka Anda tidak perlu menggunakan LIMIT yang rumit itu /OFFSET membangun sama sekali. Anda cukup menggunakan row_number() fungsi jendela.

Untuk memfilter nomor baris, Anda cukup menggunakan IN . Bergantung pada apa yang Anda inginkan di sini, Anda dapat menggunakan daftar literal, terutama jika jumlahnya tidak berurutan. Atau Anda dapat menggunakan generate_series() untuk menghasilkan daftar nomor berurutan. Tentu saja Anda juga dapat menggunakan subquery, ketika nomor disimpan di tabel lain.

Dengan daftar literal yang akan terlihat seperti ini:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
       WHERE pn.address LIKE concat('%', pn.n, '%')
             AND pn.n IN (1, 2, 4);

Jika Anda ingin menggunakan generate_series() contohnya adalah:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
       WHERE pn.address LIKE concat('%', pn.n, '%')
             AND pn.n IN (SELECT s.n
                                 FROM generate_series(1, 3) s (n));
                             

Dan subquery dari tabel lain dapat digunakan seperti ini:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
       WHERE pn.address LIKE concat('%', pn.n, '%')
             AND pn.n IN (SELECT t.nmuloc
                                 FROM elbat t);

Untuk kumpulan angka yang lebih besar, Anda juga dapat mempertimbangkan untuk menggunakan INNER JOIN pada angka, bukan IN .

Menggunakan generate_series() :

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
            INNER JOIN generate_series(1, 1000000) s (n)
                       ON s.n = pn.n
       WHERE pn.address LIKE concat('%', pn.n, '%');

Atau saat angka ada di tabel lain:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
            INNER JOIN elbat t
                       ON t.nmuloc = pn.n
       WHERE pn.address LIKE concat('%', pn.n, '%');

Perhatikan bahwa saya juga mengubah pencocokan pola ekspresi reguler menjadi LIKE simple sederhana . Itu akan membuat kueri sedikit lebih portabel. Tapi tentu saja Anda dapat menggantinya dengan ekspresi apa pun yang benar-benar Anda butuhkan.

db<>biola (dengan beberapa varian)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Saya ingin memulihkan database dengan skema yang berbeda

  2. Mengirim array nilai ke kueri sql di Ruby?

  3. PostgreSQL:Pencadangan dan Pemulihan basis data?

  4. Pembaruan massal di postgreSQL menggunakan unnest

  5. Barman Cloud – Bagian 2:Cloud Backup