17.05 - 通常の内部結合 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-175K-JPN
Language
日本語 (日本)

結合によって、複数のテーブルとビューから行と列を選択できるようになります。問合わせブロックごとに最大128個のテーブルとビューを結合できます。

内部結合は、特定の結合条件に適した複数のテーブルとビューからデータを射影します。結合する各テーブルまたは各ビューの名前を指定し、結合条件、すなわち結合するテーブルまたはビューの間に共通した関係をWHERE句に明示的に指定しなければなりません。

内部結合の構成要素



table_Aをセクション1と2の入った行セットとして定義します。table_Aleft_tableとして参照します。

table_Bをセクション1と3の入った行セットとして定義します。table_Bright_tableとして参照します。

以下のベン図で示すとおり、table_Atable_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;
このSELECT文では次の2つが問合わせされます。
  • 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値式についての不等条件である場合、Vantageではその他の不等条件の述部とまったく同じように、直積として処理されます。行の再配置時のPERIOD値式を基にした行ハッシュ処理では、ハッシュ値を計算するために内部フィールドのサイズと値が考慮されます。

     SELECT *
     FROM employee AS e, project_details AS pd
     ON e.period_of_stay = pd.project_period;