結合によって、複数のテーブルとビューから行と列を選択できるようになります。問合わせブロックごとに最大128個のテーブルとビューを結合できます。
内部結合は、特定の結合条件に適した複数のテーブルとビューからデータを射影します。結合する各テーブルまたは各ビューの名前を指定し、結合条件、すなわち結合するテーブルまたはビューの間に共通した関係をWHERE句に明示的に指定しなければなりません。
内部結合の構成要素
table_Aをセクション1と2の入った行セットとして定義します。table_Aをleft_tableとして参照します。
table_Bをセクション1と3の入った行セットとして定義します。table_Bをright_tableとして参照します。
以下のベン図で示すとおり、table_Aとtable_Bの内部結合はセクション1です。
デフォルトの結合
外部結合として明示的に宣言しない場合、結合はデフォルトではすべて内部結合です。ただし、予約語INNERを使用して明示の内部結合を指定することもできます。
次のSELECT文には、2つのテーブル(table_aおよびtable_b)の内部結合があります。
SELECT ... FROM table_a INNER JOIN table_b ...
キーワード シーケンスINNER JOINはオプションなので、以下のSELECT文も内部結合の正しい例です。ただし、キーワードINNERを指定する場合は、INNERのすぐ後ろにキーワードJOINを使用する必要があります。
SELECT ... FROM table_a JOIN table_b ... SELECT ... FROM table_a, table_b ...
内部結合では、ON句またはWHERE句のいずれかを使用して結合条件を指定することができます。内部結合にキーワードのJOINが指定されている場合には、ON句が必要です。
ON句の述部として使用されるサブクエリーでは、SAMPLE句は指定できません。
例: デフォルトの結合
employeeテーブルとemployeeテーブルを、両方のテーブルに共通の値がある列で結合することにより、Marstonという従業員の部門の場所を決めることができます。この場合は、その列はdeptnoです。
SELECT Loc FROM department, employee WHERE employee.name = 'Marston A' AND employee.deptno = department.deptno;
- Marstonの入ったemployeeファイルの部門番号は何か?
- employeeファイルのその部門の所在地コードは何か?
両方の問いに答える鍵はdeptno列であり、この列は両方のテーブルで同じ値を持っているので、結合関係を形成するために使用することができます(列の実際の名前が同一である必要はありません)。
この結合の結果は、次のとおりです。
Loc ATL
集約の入ったビューでの結合
集約列の入ったビューを結合することができます。
次の例では、テーブルcust_fileをビューcust_prod_sales (SUM (合計)演算を含む)と結合し、項目#123の10,000ドル以上購入した会社を見付けます。
CREATE VIEW cust_prod_sales (cust_no, pcode, sales) AS SELECT cust_no, pcode, SUM(sales) FROM sales_hist GROUP BY cust_no, pcode; SELECT company_name, sales FROM cust_prod_sales AS a, cust_file AS b WHERE a.cust_no = b.cust_no AND a.pcode = 123 AND a.sales > 10000;
PERIOD値式の結合
最適化ルーチンは、PERIOD値式についての等価演算子を、その他の結合計画やアクセス計画に対する式と同様に扱います。<Teradata Vantage™ SQL日付と時刻の関数および式、B035-1211>の「期間値コンストラクタ」を参照してください。
結合の述部がPERIOD値式についての不等条件である場合、Teradata Databaseではその他の不等条件の述部とまったく同じように、直積として処理されます。行の再配置時のPERIOD値式を基にした行ハッシュ処理では、ハッシュ値を計算するために内部フィールドのサイズと値が考慮されます。
SELECT * FROM employee AS e, project_details AS pd ON e.period_of_stay = pd.project_period;