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

OracleINTERSECTオペレーターの説明

    Oracle Databaseでは、INTERSECT 演算子は、左右のSELECTの結果の共通部分を返す複合クエリを作成するために使用されます ステートメント。つまり、2つのクエリを組み合わせますが、両方のクエリで返される行のみを返します。

    次のテーブルがあるとします。

    SELECT * FROM Employees;
    SELECT * FROM Customers;

    結果:

    EMPLOYEEID EMPLOYEENAME
    1 バート
    2 1月
    3 Ava
    4 Rohit
    5 監視
    6 監視
    7 監視
    CUSTOMERID CUSTOMERNAME
    1 ミア
    2 Rohit
    3 ピーター
    4 Ava
    5 監視
    6 監視

    INTERSECTを使用できます 顧客でもある従業員を返すオペレーター:

    SELECT EmployeeName FROM Employees
    INTERSECT
    SELECT CustomerName FROM Customers;

    結果:

    EMPLOYEENAME
    Ava
    モニッシュ
    Rohit

    したがって、両方のEmployeesに表示される値のみが返されます。 テーブルとCustomers テーブル。

    OracleDatabaseによるINTERSECTの実装 演算子は個別の行のみを返します。上記の例でこれを見ることができます。その名前の従業員と顧客が複数いる場合でも、Monishの場合は1行だけが返されます。

    一部のRDBMSでは、オプションのALLを受け入れることで、結果に重複を含めることができます。 INTERSECTを含むキーワード 演算子ですが、Oracleはその1つではありません(少なくとも、執筆時点ではそうではありません)。 SQLiteもそうではありません。

    代替クエリ

    INTERSECTを使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。

    SELECT 
        DISTINCT EmployeeName
    FROM Employees e
    WHERE EXISTS (SELECT CustomerName FROM Customers c
    WHERE e.EmployeeName = c.CustomerName);

    結果:

    EMPLOYEENAME
    Rohit
    Ava
    モニッシュ
    覚えておくべきことがいくつかあります

    式の数は一致する必要があり、同じデータ型グループに含まれている必要があることに注意してください。したがって、次のことはできません。

    SELECT EmployeeName FROM Employees
    INTERSECT
    SELECT CustomerId, CustomerName FROM Customers;

    結果:

    ORA-01789: query block has incorrect number of result columns

    またはこれ:

    SELECT EmployeeName FROM Employees
    INTERSECT
    SELECT CustomerId FROM Customers;

    結果:

    ORA-01790: expression must have same datatype as corresponding expression

    ただし、TO_CHAR()のような関数を使用できます 列を適切なデータ型グループに変換するには:

    SELECT EmployeeName FROM Employees
    INTERSECT
    SELECT TO_CHAR(CustomerId) FROM Customers;

    結果:

    no data found

    この場合、CustomerIdがないため、データは見つかりませんでした 値がEmployeeNameのいずれかに一致しました 値。しかし、もしそうなら、一致するものが表示されます。


    1. MariaDBでのTO_BASE64()のしくみ

    2. マージ結合連結によるソートの回避

    3. 通常のSQLServerサービスの事例を作成する

    4. localdbを個別にインストールする方法は?