Di PostgreSQL, INTERSECT
operator menggabungkan dua kueri, tetapi hanya mengembalikan baris yang dikembalikan di kedua kueri.
Sintaks
Sintaksnya seperti ini:
query1 INTERSECT [ALL] query2
Duplikat dihilangkan kecuali INTERSECT ALL
digunakan.
Contoh
Misalkan kita memiliki tabel berikut:
SELECT * FROM Employees;
SELECT * FROM Customers;
Hasil:
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
Kita dapat menggunakan INTERSECT
operator untuk mengembalikan karyawan yang juga pelanggan:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Hasil:
employeename -------------- Ava Rohit Monish
Jadi kami hanya mendapatkan nilai yang muncul di Employees
tabel yang juga muncul di Customers
meja.
Secara default, ini mengembalikan baris yang berbeda, jadi hanya satu baris yang dikembalikan untuk Monish, meskipun ada beberapa karyawan dan beberapa pelanggan dengan nama itu.
Ini sama dengan melakukan ini:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Hasil:
employeename -------------- Ava Rohit Monish
Jadi kami mendapatkan hasil yang sama dengan yang kami dapatkan ketika kami tidak menyertakan DISTINCT
operator.
Sertakan Duplikat
Seperti disebutkan, INTERSECT
operator hanya mengembalikan nilai yang berbeda secara default. Tapi kita bisa menambahkan ALL
kata kunci untuk menyertakan duplikat:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Hasil:
employeename -------------- Ava Rohit Monish Monish
Kali ini kami mendapat empat baris, bukan tiga baris yang kami dapatkan di contoh pertama kami.
Kita dapat melihat bahwa dua baris yang berisi nama Monish dikembalikan, bukan hanya satu seperti pada contoh pertama kita. Sebenarnya ada tiga pelanggan bernama Monish, tetapi hanya dua karyawan dengan nama itu. Oleh karena itu, operasi hanya memotong dua dari mereka.
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:
employeename -------------- Ava Rohit Monish