sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでのINTERSECTのしくみ

    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

    1. Oracleの関数を自動シーケンスでコンマ区切りの値に分割

    2. ORA-01460:実装されていない、または不当な変換が要求されました

    3. IRIWorkbenchでのデータ分類

    4. SQL UPDATE:テーブルの値を更新する方法を学ぶ