PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL tìm tất cả các kết hợp có thể có (hoán vị) trong truy vấn đệ quy

Trong một truy vấn đệ quy, các thuật ngữ trong bảng tìm kiếm được sử dụng trong một lần lặp sẽ bị loại bỏ và sau đó truy vấn lặp lại với các bản ghi còn lại. Trong trường hợp của bạn, điều đó có nghĩa là ngay sau khi bạn xử lý phần tử mảng đầu tiên ("A"), nó không còn khả dụng cho các hoán vị tiếp theo của các phần tử mảng. Để lấy lại các phần tử "đã sử dụng" đó, bạn cần kết hợp chéo với bảng các phần tử mảng trong truy vấn đệ quy và sau đó lọc ra các phần tử mảng đã được sử dụng trong hoán vị hiện tại (vị trí position(t.i in cte.combo) = 0 ) và một điều kiện để dừng lặp lại (ct <= 3 ).

WITH RECURSIVE t(i) AS (
  SELECT * FROM unnest('{A,B,C}'::char[])
), cte AS (
     SELECT i AS combo, i, 1 AS ct 
     FROM t 
   UNION ALL 
     SELECT cte.combo || t.i, t.i, ct + 1 
     FROM cte, t
     WHERE ct <= 3
       AND position(t.i in cte.combo) = 0
) 
SELECT ARRAY(SELECT combo FROM cte ORDER BY ct, combo) AS result;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật với hàm được gọi một lần cho mỗi hàng trong Postgres 8.4

  2. 7 mẹo thực hành tốt nhất để tải dữ liệu hàng loạt PostgreSQL

  3. Phân loại cây với một đường dẫn cụ thể?

  4. Khóa ngoại postgres có ngụ ý chỉ mục không?

  5. PostgreSQL:Cách lấy tất cả các điểm trong bán kính nhất định