クエリでは、FROM 句が最初に評価されます。これには、クエリの残りの部分からテーブル "a" を隠す効果があります。(列の別名にも同じ規則が適用されます。)
デモンストレーション用にナンセンスなテーブルをいくつかまとめました。このクエリは機能します。
SELECT *
FROM
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABCs
LEFT OUTER JOIN
(X JOIN W on X.x_id=W.w_id
JOIN Z on W.w_id=Z.z_id) AS XYZs on ABCs.a_id=XYZs.w_id
しかし、これは SELECT 句で A.a_id を参照していますが、そうではありません。
SELECT A.a_id, *
FROM
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABCs
LEFT OUTER JOIN
(X JOIN W on X.x_id=W.w_id
JOIN Z on W.w_id=Z.z_id) AS XYZs on ABCs.a_id=XYZs.w_id
ERROR: invalid reference to FROM-clause entry for table "a"
LINE 1: SELECT A.a_id, *
^
HINT: There is an entry for table "a", but it cannot be referenced from
this part of the query.
代わりに、結合式に指定したエイリアスで参照してください。
SELECT ABCs.a_id, *
FROM
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABCs
LEFT OUTER JOIN
(X JOIN W on X.x_id=W.w_id
JOIN Z on W.w_id=Z.z_id) AS XYZs on ABCs.a_id=XYZs.w_id
同じ結合式を 2 回使用するには、2 つの異なるエイリアスを使用します。
SELECT *
FROM
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABC_1s
LEFT OUTER JOIN
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABC_2s on ABC_1s.a_id=ABC_2s.c_id
必要に応じて、SELECT 句で同じ構文 alias_name.column_name を使用します。
SELECT ABC_1s.a_id, ABC_2s.a_id, *
FROM
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABC_1s
LEFT OUTER JOIN
(A JOIN B ON A.a_id =B.b_id
JOIN C on B.b_id=C.c_id) AS ABC_2s on ABC_1s.a_id=ABC_2s.c_id