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

Giải thích về toán tử INTERSECT của Oracle

Trong Cơ sở dữ liệu Oracle, INTERSECT toán tử được sử dụng để tạo một truy vấn kết hợp trả về giao điểm của các kết quả của SELECT bên trái và bên phải các câu lệnh. Nói cách khác, nó 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.

Ví dụ

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

SELECT * FROM Employees;
SELECT * FROM Customers;

Kết quả:

EMPLOYEEID NHÂN VIÊN
1 Bart
2 tháng 1
3 Ava
4 Rớ rớ
5 Monish
6 Monish
7 Monish
CUSTOMERID CUSTOMERNAME
1 Mia
2 Rớ rớ
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
Monish
Vớ vẩn

Vì vậy, nó chỉ trả về những giá trị xuất hiện trong cả Employees bảng và Customers bàn.

Cơ sở dữ liệu Oracle triển khai INTERSECT toán tử chỉ trả về các hàng riêng biệt. Chúng ta có thể thấy điều này trong ví dụ trên. Nó chỉ trả về một hàng cho Monish, mặc dù có nhiều nhân viên và nhiều khách hàng có tên đó.

Một số RDBMS cho phép chúng tôi đưa các bản sao vào kết quả bằng cách chấp nhận ALL tùy chọn từ khóa với INTERSECT , nhưng Oracle không phải là một trong số chúng (ít nhất, không phải tại thời điểm viết bài). SQLite cũng vậy.

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
Vớ vẩn
Ava
Monish

Một số điều cần nhớ

Lưu ý rằng các biểu thức phải khớp ở dạng số và phải nằm trong cùng một nhóm kiểu dữ liệu. Do đó, chúng tôi không thể làm những việc sau:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;

Kết quả:

ORA-01789: query block has incorrect number of result columns

Hoặc cái này:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Kết quả:

ORA-01790: expression must have same datatype as corresponding expression

Mặc dù, chúng ta có thể sử dụng các hàm như TO_CHAR() để chuyển đổi một cột thành một nhóm kiểu dữ liệu phù hợp:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;

Kết quả:

no data found

Trong trường hợp này, không có dữ liệu nào được tìm thấy vì không có CustomerId các giá trị khớp với bất kỳ EmployeeName nào các giá trị. Nhưng nếu họ làm vậy, thì chúng ta sẽ thấy các trận đấu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo Bảng tính Excel từ Cơ sở dữ liệu Oracle

  2. Cách loại bỏ số giờ không làm việc trong Oracle

  3. Oracle DateTime trong mệnh đề Where?

  4. Tại sao lại sử dụng mệnh đề JOIN thay vì điều kiện WHERE?

  5. Oracle:`(+)` làm gì trong mệnh đề WHERE?