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のいずれかに一致しました 値。しかし、もしそうなら、一致するものが表示されます。