web-dev-qa-db-ja.com

2つのテーブルをエイリアスで結合する

いくつかの問題を引き起こす次のクエリがあります:TLSN_TRD_IDがTLEAテーブルに明確にあるにもかかわらず、ORA-00904: "TLEA"."TLSN_TRD_ID": invalid identifierが表示されます。これは、エイリアシングが正しく機能しないかのようです。 RECONテーブルとTLEAテーブルは別々に機能しますが、以下のように左結合を行おうとすると、エラーが発生します。問題となる可能性のある提案はありますか?

SELECT * FROM

(
SELECT * FROM DF_RISK_SIT2_owner.RECON_RESULTS
WHERE (RS_ONLY = 1 or VERSION_MISMATCH = 1) AND  REC_SYSTEM = 'SUMMIT'
)RECON

LEFT JOIN

(
SELECT * FROM DF_RISK_CUAT_owner.TLEA
  INNER JOIN
        (SELECT  TLSN_TRD_ID,TLSN_LEG_ID, MAX(TLEA_COB_DT) AS MDate
            FROM    DF_RISK_CUAT_owner.TLEA
            GROUP BY TLSN_TRD_ID,TLSN_LEG_ID
        )MaxDate
            ON MaxDate.TLSN_TRD_ID = DF_RISK_CUAT_owner.TLEA.TLSN_TRD_ID
            AND MaxDate.MDate = DF_RISK_CUAT_owner.TLEA.TLEA_COB_DT
            AND MaxDate.TLSN_TRD_ID='C8112832LX'
)TLEA

ON RECON.RS_TRD_ID =       TLEA.TLSN_TRD_ID

更新:問題は重複する列名に関連しているようです:LEFT JOINの下の行をSELECT MaxDate.TLSN_TRD_ID AS "A_A_TLSN_TRD_ID"で置き換えてから、TLSA.A_A_TLSN_TRD_IDで結合すると機能します。不思議なことに、私がTLEA.MaxDate.TLSN_TRD_IDに参加すると機能しません。なぜか?

1
Nickpick

これは、SELECT *を使用し、テーブルをそれ自体に結合しているためです。 DBエンジンはすべての列を返そうとするため、同じ名前の列が複数ある場合は、どの列を参照しているかを知る必要があります。両方が必要な場合は、それらをエイリアスで指定して、出力する順序を指定する必要があります。

集計が機能する理由は、重複する列を返そうとしないためです。 SELECT *を必要な列に置き換え、エイリアスを使用して、必要な列を指定します。

一般的なベストプラクティスとして、SELECT *を使用しないでください。常に列名を指定してください。

4
Haris Khan