Teradata-結合
結合は、複数のテーブルのレコードを結合するために使用されます。テーブルは、これらのテーブルの共通の列/値に基づいて結合されます。
利用可能な結合にはさまざまなタイプがあります。
- 内部結合
- 左外部結合
- 右外部結合
- 完全外部結合
- 自己結合
- クロス結合
- デカルト生産参加
内部結合
内部結合は、複数のテーブルのレコードを結合し、両方のテーブルに存在する値を返します。
構文
以下は、INNERJOINステートメントの構文です。
SELECT col1, col2, col3….
FROM
Table-1
INNER JOIN
Table-2
ON (col1 = col2)
<WHERE condition>;
例
次の従業員テーブルと給与テーブルについて考えてみます。
従業員番号 | ファーストネーム | 苗字 | JoinedDate | 部門番号 | 誕生日 |
---|---|---|---|---|---|
101 | マイク | ジェームズ | 2005年3月27日 | 1 | 1980年1月5日 |
102 | ロバート | ウィリアムズ | 2007年4月25日 | 2 | 1983年3月5日 |
103 | ピーター | ポール | 2007年3月21日 | 2 | 1983年4月1日 |
104 | アレックス | スチュアート | 2008年2月1日 | 2 | 1984年11月6日 |
105 | ロバート | ジェームズ | 2008年1月4日 | 3 | 1984年12月1日 |
従業員番号 | キモい | 控除 | 給料 |
---|---|---|---|
101 | 40,000 | 4,000 | 36,000 |
102 | 80,000 | 6,000 | 74,000 |
103 | 90,000 | 7,000 | 83,000 |
104 | 75,000 | 5,000 | 70,000 |
次のクエリは、共通列EmployeeNoのEmployeeテーブルとSalaryテーブルを結合します。各テーブルにはエイリアスAとBが割り当てられ、列は正しいエイリアスで参照されます。
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
INNER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo);
上記のクエリを実行すると、次のレコードが返されます。従業員105は、給与テーブルに一致するレコードがないため、結果に含まれていません。
*** Query completed. 4 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo NetPay
----------- ------------ -----------
101 1 36000
102 2 74000
103 2 83000
104 2 70000
アウタージョイン
LEFT OUTERJOINとRIGHTOUTER JOINも、複数のテーブルの結果を組み合わせたものです。
LEFT OUTER JOIN 左側のテーブルからすべてのレコードを返し、右側のテーブルから一致するレコードのみを返します。
RIGHT OUTER JOIN 右側のテーブルからすべてのレコードを返し、左側のテーブルから一致する行のみを返します。
FULL OUTER JOINLEFTOUTERとRIGHTOUTERJOINSの両方の結果を組み合わせます。結合されたテーブルから一致する行と一致しない行の両方を返します。
構文
以下は、OUTERJOINステートメントの構文です。LEFT OUTER JOIN、RIGHT OUTER JOIN、またはFULL OUTERJOINのいずれかのオプションを使用する必要があります。
SELECT col1, col2, col3….
FROM
Table-1
LEFT OUTER JOIN/RIGHT OUTER JOIN/FULL OUTER JOIN
Table-2
ON (col1 = col2)
<WHERE condition>;
例
次のLEFTOUTERJOINクエリの例について考えてみます。Employeeテーブルからすべてのレコードを返し、Salaryテーブルから一致するレコードを返します。
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
LEFT OUTER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo)
ORDER BY A.EmployeeNo;
上記のクエリを実行すると、次の出力が生成されます。従業員105の場合、給与テーブルに一致するレコードがないため、NetPay値はNULLです。
*** Query completed. 5 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo NetPay
----------- ------------ -----------
101 1 36000
102 2 74000
103 2 83000
104 2 70000
105 3 ?
クロス結合
クロス結合は、左側のテーブルのすべての行を右側のテーブルのすべての行に結合します。
構文
以下は、CROSSJOINステートメントの構文です。
SELECT A.EmployeeNo, A.DepartmentNo, B.EmployeeNo,B.NetPay
FROM
Employee A
CROSS JOIN
Salary B
WHERE A.EmployeeNo = 101
ORDER BY B.EmployeeNo;
上記のクエリを実行すると、次の出力が生成されます。従業員テーブルのEmployeeNo101は、給与テーブルのすべてのレコードと結合されます。
*** Query completed. 4 rows found. 4 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo EmployeeNo NetPay
----------- ------------ ----------- -----------
101 1 101 36000
101 1 104 70000
101 1 102 74000
101 1 103 83000