外参照は、下記のように動作します。このプロセスは、最適化ルーチンによって生成される問合わせ計画を反映したものではありません。このプロセスは、相関subqueryがどのように動作するかを概念的に示しています。
- 外問合わせの各行ごとに、その行の中の外部参照の値が、内subqueryの結果の評価に使用されます。
- 内問合わせに対して指定されている結合制約に基づいて、内サブクエリー式の結果が、外問合わせ内の関連行に結合されます。
相関サブクエリーの意義は、そのすぐ外の問合わせ式の行ごとに内サブクエリー式を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);
プロセスは以下のとおりです。
- 一方はe1、もう一方はe2という、上記で説明したテーブルのコピーが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;
- 内問合わせ内の各行ごとのサブクエリーの評価が完了すると、拡張された個々の問合わせは次のようになります。
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;
- 外問合わせ内の各行についても、Vantageでは、同じ評価が行なわれます。
- 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