PostgreSQLでは、INTERSECT 演算子は2つのクエリを組み合わせますが、両方のクエリで返される行のみを返します。
構文は次のようになります:
query1 INTERSECT [ALL] query2
INTERSECT ALLでない限り、重複は排除されます 使用されます。
次のテーブルがあるとします。
SELECT * FROM Employees;
SELECT * FROM Customers; 結果:
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
INTERSECTを使用できます 顧客でもある従業員を返すオペレーター:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; 結果:
employeename -------------- Ava Rohit Monish
したがって、Employeesに表示される値のみを取得します Customersにも表示されるテーブル テーブル。
デフォルトでは、個別の行が返されるため、その名前の従業員と顧客が複数いる場合でも、Monishには1つの行のみが返されます。
これを行うのと同じです:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers; 結果:
employeename -------------- Ava Rohit Monish
したがって、DISTINCTを含めなかった場合と同じ結果が得られます。 オペレーター。
前述のように、INTERSECT 演算子は、デフォルトでは個別の値のみを返します。ただし、ALLを追加することはできます 重複を含めるキーワード:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers; 結果:
employeename -------------- Ava Rohit Monish Monish
今回は、最初の例で取得した3行ではなく、4行を取得しました。
最初の例のように1つだけではなく、Monishという名前を含む2つの行が返されたことがわかります。実際にはMonishという顧客は3人いますが、その名前の従業員は2人だけです。したがって、操作はそれらのうちの2つとのみ交差します。
INTERSECTを使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); 結果:
employeename -------------- Ava Rohit Monish