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

Menyimpan dan menanyakan pohon interval di PostgreSQL

Anda dapat menggunakan tipe data rentang dan menyimpan setiap tipe terpisah dalam satu baris.

Untuk sampel Anda:

-- The table
CREATE TABLE sets(id text, range int4range);
-- Values of set A
INSERT INTO sets VALUES('A', '[1,1]'),('A','[7,7]'),('A','[9,13]');
-- Values of set B
INSERT INTO sets VALUES('B','[1,1]'),('B','[7,7]'),('B','[10,10]');

Untuk memeriksa apakah B adalah subset dari A, Anda dapat menggabungkan keduanya dengan semua tupel yang rentang A berisi rentang B:

 SELECT b.range
 FROM sets b JOIN sets a
     ON a.range @> b.range
 WHERE a.id='A' AND b.id='B'

Dengan itu, Anda dapat memeriksa apakah semua nilai dari himpunan B ada di hasil di atas (yang berarti bahwa semua rentang B berisi setidaknya satu rentang A):

 SELECT NOT EXISTS(
     SELECT 1 FROM sets q WHERE q.id='B' AND q.range NOT IN (
         SELECT b.range
         FROM sets b JOIN sets a
             ON a.range @> b.range
         WHERE a.id='A' AND b.id='B'
     ));

Untuk mendapatkan persimpangan, Anda dapat menggabungkan keduanya dan mengecualikan yang kosong:

 SELECT * FROM (
     SELECT a.range * b.range AS intersec
     FROM sets a CROSS JOIN sets b WHERE  a.id='A' AND b.id='B'
 ) i WHERE NOT isempty(i.intersec);

Satu masalah tentang pendekatan ini, adalah bahwa Anda harus menyimpan hanya rentang yang terpisah melalui tupel yang berbeda. Misalnya, rentang [1,5] dan [4,7] dari suatu himpunan harus berada dalam tupel dengan [1,7] saja. Untuk memastikannya, Anda dapat menyisipkannya ke dalam tabel sementara (saat menyisipkan atau memperbarui), mereka bergabung secara silang dengan tabel itu sendiri dengan tupel yang tumpang tindih dan mereka bergabung dengan tupel dan menjaga yang lain tetap seperti semula.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Licin dan bonecp:org.postgresql.util.PSQLException:FATAL:maaf, terlalu banyak klien yang sudah error

  2. Pembaruan singa menghapus pengguna 'postgres'. Bagaimana cara mengembalikannya?

  3. psql:tidak dapat terhubung ke server:Koneksi ditolak Kesalahan saat menghubungkan ke basis data jarak jauh

  4. Rails:rake db:create:all (tidak dapat terhubung ke server)

  5. Optimalkan penghapusan Postgres dari catatan yatim