説明
JOIN句は、2つ以上のテーブルの行を関連する列に基づいてマッチングし、結合するために使用されます。
権限要件
テーブル結合(JOIN)を実行する際には、現在のユーザーがJOINに参加するテーブルに対して少なくともSELECT権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、Oracleモードの権限分類を参照してください。
構文
table_references:
table_reference [, table_reference ...]
table_reference:
table_factor
| joined_table
table_factor:
table_name [PARTITION (partition_name_list)] [[AS] table_alias_name]
| table_subquery [AS] table_alias_name
| (table_references)
partition_name_list:
partition_name [, partition_name ...]
joined_table:
table_reference
| table_reference1, table_reference2 [WHERE join_condition]
| table_reference1
{INNER} JOIN table_reference2
| table_reference1
{LEFT | RIGHT | FULL} [OUTER] JOIN table_reference2
{ON join_condition | WHERE join_condition}
| table_reference1 {LEFT | RIGHT | FULL} [OUTER] JOIN table_reference2
join_condition:
expression
| column_name1 = column_name2
パラメータの説明
table_references(テーブル参照)
1つまたは複数のtable_referenceをカンマで区切って表すリストです。SELECTステートメントでは、FROMの後に複数のテーブルを続けることができ、これらのテーブルはカンマで区切られます。
また、table_factorまたはjoined_tableでもあります。つまり、1つのテーブル参照は単一のテーブルである場合も、複数のテーブルの結合結果である場合もあります。
table_name:データを照会するテーブルまたはビューの名前を指定します。OceanBaseデータベースは、DBLinkを使用して他のデータベースのテーブルを照会することをサポートしています(table_name@dblink_name)。DBLinkの使用方法の詳細については、DBLinkを使用したリモートデータベースへのアクセスを参照してください。説明
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity Editionは現在、DBLink機能をサポートしていません。
PARTITION (partition_name_list):オプションで、特定のパーティションのクエリを指定します。partition_name_list:パーティション名のリストを表します。partition_nameはパーティション名を表します。
table_factor(テーブルファクター)
最も基本的なテーブル参照ユニットです。以下の形式があります:
table_name [PARTITION (partition_name_list)] [[AS] table_alias_name]:実際のテーブル名で、パーティション(PARTITION句)およびテーブルエイリアス(AS table_alias_name)をオプションで指定できます。table_subquery [AS] table_alias_name]:サブクエリで、サブクエリの結果にエイリアスを指定できます。サブクエリの詳細については、サブクエリを参照してください。(table_references):括弧で囲まれたtable_referencesで、テーブル参照のネスト使用を許可します。
joined_table(結合テーブル)
複数のテーブルの結合結果を表します。以下の形式があります:
table_reference:単一のテーブル参照(結合テーブルと呼ばれていますが、単一のテーブルである場合もあります)。table_reference1, table_reference2 [WHERE join_condition]:2つのテーブル参照で、カンマで区切られ、WHERE句で結合条件を指定します(暗黙的結合)。table_reference1 {INNER} JOIN table_reference2:2つのテーブル参照で、INNER JOIN(内部結合)を使用します。table_reference1 {LEFT | RIGHT | FULL} [OUTER] JOIN table_reference2 {ON join_condition | WHERE join_condition}:2つのテーブル参照で、LEFT OUTER JOIN(左外部結合)、RIGHT OUTER JOIN(右外部結合)、またはFULL OUTER JOIN(完全外部結合)を使用し、ON句またはWHERE句で結合条件を指定します。table_reference1 {LEFT | RIGHT | FULL} [OUTER] JOIN table_reference2:2つのテーブル参照で、LEFT OUTER JOIN、RIGHT OUTER JOIN、またはFULL OUTER JOINを使用します。自然結合は、同じ列名に基づいて自動的に結合されます。
join_condition(結合条件)
テーブル結合の条件を指定するために使用されます。以下の2つの形式があります:
expression:式、例えばtable1.column1 = table2.column2 AND table1.column3 > 10。column_name1 = column_name2:2つの列名間の等価比較、例えばtable1.column1 = table2.column1。
例
-- 国家テーブルを作成する
CREATE TABLE countries (
country_id VARCHAR2(2) PRIMARY KEY,
country_name VARCHAR2(40),
region_id NUMBER
);
-- 地点テーブルを作成する
CREATE TABLE locations (
location_id NUMBER PRIMARY KEY,
street_address VARCHAR2(40),
postal_code VARCHAR2(12),
city VARCHAR2(30),
state_province VARCHAR2(25),
country_id VARCHAR2(2),
CONSTRAINT loc_country_fk FOREIGN KEY (country_id)
REFERENCES countries(country_id)
);
-- 部門テーブルを作成する
CREATE TABLE departments (
department_id NUMBER PRIMARY KEY,
department_name VARCHAR2(30),
manager_id NUMBER,
location_id NUMBER,
CONSTRAINT dept_loc_fk FOREIGN KEY (location_id)
REFERENCES locations(location_id)
);
-- 従業員テーブルを作成する
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(20),
hire_date DATE,
job_id VARCHAR2(10),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER,
department_id NUMBER,
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_manager_fk FOREIGN KEY (manager_id)
REFERENCES employees(employee_id)
);
-- 国家データを挿入する
INSERT INTO countries VALUES ('US', 'United States', 2);
INSERT INTO countries VALUES ('CA', 'Canada', 2);
-- 地点データを挿入する
INSERT INTO locations VALUES (
1000,
'1297 Via Cola di Rie',
'00989',
'Roma',
'Lazio',
'US'
);
INSERT INTO locations VALUES (
1100,
'93091 Sulfur Springs',
'10925',
'Toronto',
'Ontario',
'CA'
);
-- 部門データを挿入する
INSERT INTO departments VALUES (10, 'Administration', NULL, 1000);
INSERT INTO departments VALUES (20, 'Marketing', NULL, 1100);
-- 従業員データを挿入する
INSERT INTO employees VALUES (
100,
'Steven',
'King',
'SKING',
'515.123.4567',
TO_DATE('17-06-2003', 'DD-MM-YYYY'),
'AD_PRES',
24000,
NULL,
NULL,
10
);
INSERT INTO employees VALUES (
101,
'Neena',
'Kochhar',
'NKOCHHAR',
'515.123.4568',
TO_DATE('21-09-2005', 'DD-MM-YYYY'),
'AD_VP',
17000,
NULL,
100,
10
);
-- SQLクエリの例
-- 1. 基本内部結合
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
-- 2. 複数テーブル結合
SELECT e.employee_id,
e.first_name,
d.department_name,
l.city,
c.country_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
INNER JOIN locations l ON d.location_id = l.location_id
INNER JOIN countries c ON l.country_id = c.country_id;
-- 3. 左外部結合
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id;
-- 4. 自己結合(従業員とそのマネージャーを照会する)
SELECT
e1.employee_id,
e1.first_name || ' ' || e1.last_name AS employee_name,
e2.first_name || ' ' || e2.last_name AS manager_name
FROM employees e1
LEFT OUTER JOIN employees e2 ON e1.manager_id = e2.employee_id;
-- 右外部結合(RIGHT JOIN)
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
-- 全外部結合(FULL OUTER JOIN)
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;
-- USING句を使用した結合
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
JOIN departments d USING (department_id);