17.10 - 相関SUBQUERYにおける外部参照 - Advanced SQL Engine - Teradata Database

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

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

外参照は、下記のように動作します。このプロセスは、最適化ルーチンによって生成される問合わせ計画を反映したものではありません。このプロセスは、相関subqueryがどのように動作するかを概念的に示しています。

  1. 外問合わせの各行ごとに、その行の中の外部参照の値が、内subqueryの結果の評価に使用されます。
  2. 内問合わせに対して指定されている結合制約に基づいて、内サブクエリー式の結果が、外問合わせ内の関連行に結合されます。

相関サブクエリーの意義は、そのすぐ外の問合わせ式の行ごとに内サブクエリー式を1回ずつ実行するということにあります。そのような意義があっても、サブクエリーの各繰返しで固有の結果が生じるとは限りません。

そのような動作に関して以下に示した例では、単純なemployeeテーブルが使われています。

employee      
emp_no emp_name 性別 年齢
PI NN
101 Friedrich F 23
102 Harvey M 47
103 Agrawal M 65
104 Valduriez M 34
105 Cariño F 39
106 Au M 28
107 Takamoto F 51
108 Ghazal F 26

以下のSELECT文は、単純な相関サブクエリーの動作を示しています。内と外の両方の問合わせで同じテーブルが参照されているので、わかりやすいように両方の参照にも相関名が与えられますが、その名前のうちの1つしか(どちらでもかまいません)別名化してはいけません。

     SELECT *
     FROM employee AS e1
     WHERE age < (SELECT MAX(age)
                  FROM employee AS e2
                  WHERE e1.sex = e2.sex);

プロセスは以下のとおりです。

  1. 一方はe1、もう一方はe2という、上記で説明したテーブルのコピーが2つ作成されます。
  2. 内問合わせを評価するには、外の包含する側の問合わせのデータが必要です。

    内問合わせの評価は、以下のような一連の仮想個別問合わせになります。

         SELECT 101, 'Friedrich', 'F', 23
         FROM employee AS e1
         WHERE 23 < (SELECT MAX(age)
                     FROM employee AS e2
                     WHERE 'F' = e2.sex;
    
       …
         SELECT 108, 'Ghazal', 'F', 26
         FROM employee as e1
         WHERE 26 < (SELECT MAX(age)
                     FROM employee AS e2
                     WHERE 'F' = e2.sex;
  3. 内問合わせ内の各行ごとのサブクエリーの評価が完了すると、拡張された個々の問合わせは次のようになります。
         SELECT 101, 'Friedrich', F, 23
         FROM employee AS e1
         WHERE 23 < 51;
    
         SELECT 102, 'Harvey', M, 47
         FROM employee AS e1
         WHERE 47 < 65;
    
         SELECT 103, 'Agrawal', M, 65
         FROM employee AS e1
         WHERE 65 < 65;
    
         SELECT 104, 'Valduriez', M, 34
         FROM employee AS e1
         WHERE 34 < 65;
    
         SELECT 105, 'Cariño', F, 39
         FROM employee AS e1
         WHERE 39 < 51;
    
         SELECT 106, 'Au', M, 28
         FROM employee AS e1
         WHERE 28 < 65;
    
         SELECT 107, 'Takamoto', F, 51
         FROM employee AS e1
         WHERE 51 < 51;
    
         SELECT 108, 'Ghazal', F, 26
         FROM employee AS e1
         WHERE 26 < 51;
  4. 外問合わせ内の各行についても、Vantageでは、同じ評価が行なわれます。
  5. Employee 103のAgrawalは、テーブル内の男性最高年齢よりも年齢が低くないため、結果から除外されます。同様にEmployee 107のTakamotoも、テーブル内の女性最高年齢よりも年齢が低くないために除外されます。

最終結果は次のようなテーブルでレポートされます。

   emp_no emp_name  sex age
   -----  -------   --- ---
    101   Friedrich  F   23
    102   Harvey     M   47
    104   Valduriez  M   34
    105   Cariño     F   39
    106   Au         M   28
    108   Ghazal     F   26