1

テーブル結合のグループにラベルが付けられている場合に、完全修飾されたテーブル/列を参照するための正しい方法または構文は何ですか? 環境:

SELECT ... FROM 
(A JOIN B ON A.?=B.? JOIN C on B.?=C.?) AS ABCs 
LEFT OUTER JOIN 
(X JOIN W on X.?=W.? JOIN Z on W.?=Z.?) AS XYZs on ABCs.?=XYZ.?

テーブルまたはテーブルのグループにラベルを付ける場合、難読化されたテーブルを直接参照できなくなったようです。ラベル名を使用する必要があります。たとえば、上記のコードでは、各テーブルに ID 列があり、通常は A.id または B.id を介して参照しますが、テーブルにラベルを付ける場合は、ABCs.id を介して参照する必要があります。 ..あいまいなエラーです。

「ABCs.A.id」と同様の解決策を期待していました。

FWIW、実際には、これを使用して大きな複合テーブルをそれ自体に結合しているため、命名規則があります。

4

1 に答える 1

1

クエリでは、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
于 2013-08-26T22:52:45.897 に答える