Di Oracle Database, INTERSECT
operator digunakan untuk membuat kueri gabungan yang mengembalikan hasil perpotongan kiri dan kanan SELECT
pernyataan. Dengan kata lain, ini menggabungkan dua kueri, tetapi hanya mengembalikan baris yang dikembalikan di kedua kueri.
Contoh
Misalkan kita memiliki tabel berikut:
SELECT * FROM Employees;
SELECT * FROM Customers;
Hasil:
EMPLOYEEID | NAMA KARYAWAN |
---|---|
1 | Bart |
2 | Jan |
3 | Ava |
4 | Rohit |
5 | Senin |
6 | Senin |
7 | Senin |
ID PELANGGAN | NAMA PELANGGAN |
---|---|
1 | Mia |
2 | Rohit |
3 | Petrus |
4 | Ava |
5 | Senin |
6 | Senin |
Kita dapat menggunakan INTERSECT
operator untuk mengembalikan karyawan yang juga pelanggan:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Hasil:
NAMA KARYAWAN |
---|
Ava |
Senin |
Rohit |
Jadi itu hanya mengembalikan nilai-nilai yang muncul di kedua Employees
tabel dan Customers
meja.
Implementasi Oracle Database dari INTERSECT
operator mengembalikan baris yang berbeda saja. Hal ini dapat kita lihat pada contoh di atas. Ini mengembalikan hanya satu baris untuk Monish, meskipun ada banyak karyawan dan banyak pelanggan dengan nama itu.
Beberapa RDBMS memungkinkan kami untuk menyertakan duplikat dalam hasil dengan menerima ALL
opsional kata kunci dengan INTERSECT
operator, tetapi Oracle bukan salah satunya (setidaknya, tidak pada saat penulisan). SQLite juga tidak.
Kueri Alternatif
Anda bisa mendapatkan hasil yang sama tanpa menggunakan INTERSECT
operator. Misalnya, kita dapat menulis ulang contoh pertama kita menjadi ini:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Hasil:
NAMA KARYAWAN |
---|
Rohit |
Ava |
Senin |
Beberapa Hal yang Perlu Diingat
Perhatikan bahwa ekspresi harus cocok dalam jumlah dan harus dalam grup tipe data yang sama. Oleh karena itu, kami tidak dapat melakukan hal berikut:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;
Hasil:
ORA-01789: query block has incorrect number of result columns
Atau ini:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;
Hasil:
ORA-01790: expression must have same datatype as corresponding expression
Meskipun, kita dapat menggunakan fungsi seperti TO_CHAR()
untuk mengonversi kolom ke grup tipe data yang sesuai:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;
Hasil:
no data found
Dalam hal ini, tidak ada data yang ditemukan karena tidak ada CustomerId
nilai cocok dengan salah satu EmployeeName
nilai-nilai. Tetapi jika mereka melakukannya, maka kita akan melihat kecocokannya.