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

Cách INTERSECT hoạt động trong PostgreSQL

Trong PostgreSQL, INTERSECT toán tử kết hợp hai truy vấn, nhưng chỉ trả về những hàng được trả về trong cả hai truy vấn.

Cú pháp

Cú pháp như sau:

query1 INTERSECT [ALL] query2

Các bản sao được loại bỏ trừ khi INTERSECT ALL được sử dụng.

Ví dụ

Giả sử chúng ta có các bảng sau:

SELECT * FROM Employees;
SELECT * FROM Customers;

Kết quả:

 employeeid | employeename 
------------+--------------
          1 | Bart
          2 | Jan
          3 | Ava
          4 | Rohit
          5 | Monish
          6 | Monish
          7 | Monish

 customerid | customername 
------------+--------------
          1 | Mia
          2 | Rohit
          3 | Peter
          4 | Ava
          5 | Monish
          6 | Monish

Chúng ta có thể sử dụng INTERSECT nhà điều hành để trả lại nhân viên cũng là khách hàng:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Kết quả:

 employeename 
--------------
 Ava
 Rohit
 Monish

Vì vậy, chúng tôi chỉ nhận được các giá trị xuất hiện trong Employees bảng cũng xuất hiện trong Customers bàn.

Theo mặc định, nó trả về các hàng riêng biệt, do đó, chỉ có một hàng được trả về cho Monish, mặc dù có nhiều nhân viên và nhiều khách hàng có tên đó.

Cũng giống như làm điều này:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Kết quả:

 employeename 
--------------
 Ava
 Rohit
 Monish

Vì vậy, chúng tôi nhận được cùng một kết quả mà chúng tôi nhận được khi chúng tôi không bao gồm DISTINCT nhà điều hành.

Bao gồm các bản sao

Như đã đề cập, INTERSECT toán tử chỉ trả về các giá trị riêng biệt theo mặc định. Nhưng chúng ta có thể thêm ALL từ khóa để bao gồm các bản sao:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Kết quả:

 employeename 
--------------
 Ava
 Rohit
 Monish
 Monish

Lần này chúng ta có bốn hàng, thay vì ba hàng như trong ví dụ đầu tiên.

Chúng ta có thể thấy rằng hai hàng chứa tên Monish đã được trả về thay vì chỉ một hàng như trong ví dụ đầu tiên của chúng tôi. Thực tế có ba khách hàng được gọi là Monish, nhưng chỉ có hai nhân viên có tên đó. Do đó, hoạt động chỉ giao nhau giữa hai trong số chúng.

Một Truy vấn Thay thế

Có thể nhận được kết quả tương tự mà không cần sử dụng INTERSECT nhà điều hành. Ví dụ:chúng tôi có thể viết lại ví dụ đầu tiên của chúng tôi thành ví dụ này:

SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Kết quả:

 employeename 
--------------
 Ava
 Rohit
 Monish

  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 quyền và bảo mật của PostgreSQL - Khóa giản đồ công khai

  2. Cách Cluster Odoo 12 với PostgreSQL Streaming Replication để có tính khả dụng cao

  3. Cài đặt icu4c phiên bản 63 với Homebrew

  4. Chuyển từ MySQL sang PostgreSQL - mẹo, thủ thuật và mẹo gì?

  5. Cột postgres không tồn tại