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

Loại THAM GIA nào để sử dụng

Rõ ràng, bạn có các giá trị trùng lặp cho cả hai cột tham gia. Thay vì sản phẩm Descartes, một [INNER] JOIN sẽ tạo ra điều này, bạn muốn mỗi hàng chỉ được sử dụng một lần . Bạn có thể đạt được điều này bằng cách thêm một số hàng (rn ) mỗi bản sao và tham gia trên rn ngoài ra.

Mỗi bảng có thể có nhiều hơn hoặc ít hơn các lỗi cho cùng một giá trị so với bảng khác trừ khi bạn có các hạn chế bổ sung tại chỗ (như ràng buộc FK) - nhưng không có gì trong câu hỏi của bạn. Để giữ tất cả các hàng một sẽ sử dụng FULL [OUTER] JOIN . Nhưng bạn muốn giữ lại 10000 bản ghi trong kết quả, đó là bản ghi của table2 . Vì vậy, nó phải là LEFT [OUTER] JOIN trên table1 (với 40 hàng) - và loại trừ các hàng thừa có thể có khỏi table1 .

SELECT t1."LocationArea", t2."Location"
FROM  (
   SELECT "Location"
        , row_number() OVER (PARTITION BY "Location") AS rn
   FROM   table2
   ) t2
LEFT JOIN (
   SELECT "LocationArea"
        , row_number() OVER (PARTITION BY "LocationArea") AS rn
   FROM   table1
   ) t1 ON t1."LocationArea" = t2."Location"
       AND t1.rn = t2.rn;

Hoạt động cho Postgres hoặc SQL Server. MySQL không hỗ trợ các hàm cửa sổ, bạn sẽ cần một hàm thay thế:

  • SQL CHỌN mục nhập cuối cùng mà không giới hạn

Nói rõ hơn:LEFT JOIN chỉ là viết tắt của LEFT OUTER JOIN , vì vậy bạn đã sử dụng một phép nối bên ngoài. Tuyên bố của bạn là một sự hiểu lầm :

Tôi đang sử dụng các báo cáo ZOHO không hỗ trợ kết nối bên ngoài.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập tệp .sql trên windows vào postgresql

  2. Tương đương với univot () trong PostgreSQL

  3. Công cụ GUI cho PostgreSQL

  4. Truy vấn một tham số (cài đặt postgresql.conf) như max_connections

  5. Psycopg2 sử dụng hết bộ nhớ trên truy vấn chọn lọc lớn