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