私は頻繁に缶詰と表示されて応答があることを、この同じトピックについては、このフォーラムへのさまざまな質問に参照:いいえ、Oracleはサブクエリが複数のレベルの深さ(とどちらもMySQLはありませんが入れ子に相関していないOracleは、どのレベルでもネストされたサブクエリを相関させますか?
)。
これで、Oracleはあるレベルのサブクエリを相関させると判断します。しかし、私は以下のクエリを持っており、それがこのエラーメッセージを返します。
ORA-00904:「CD」「FIELD6」:無効な識別子
このクエリはそれとして作られることが重要ですはUNIONステートメントを含む実際のクエリの単純化されたバージョンです。エラーメッセージが返された理由をデバッグするとき、私はそれをこの最もシンプルなバージョン(以下)に縮小しました。私は、この最もシンプルなバージョンへの代替JOINアプローチがあるかもしれないことに気づいていますが、そのような代替アプローチは実際のクエリでは有効ではありません。下記のコードが動作するならば、もっと複雑なクエリも動作するように見えます。下のコードがうまくいかない場合は、Oracleのマニュアルと上記の "canned"の回答の中で私が誤って読んでいるのは何ですか?
SELECT a.*
FROM
main_detail cd INNER JOIN
(
SELECT
Field1,
Field2,
Field3,
Field4,
Field5,
Field6,
Field7
FROM other_detail x2
WHERE x2.Field1 = cd.Field1 AND x2.Field6 = cd.Field6
) a ON
a.Field1 = cd.Field1
AND a.Field4 = cd.Field4
AND a.Field6 = cd.Field6
以下は、私たちの実際の必要性によりよく似ています。
SELECT h.*, a.*
FROM
header h,
(
SELECT
Field1,
Field2,
Field3,
Field4,
Field5,
Field6,
Field7
FROM main_detail x1
WHERE x1.Field1 = h.Field1 AND x1.Field6 = h.Field6
UNION
SELECT
Field1,
Field2,
Field3,
Field4,
Field5,
Field6,
Field7
FROM other_detail x2
WHERE x2.Field1 = h.Field1 AND x2.Field6 = h.Field6
) a
WHERE
a.Field1 = h.Field1 AND
a.Field6 = h.Field6
は、上記の比較を含めないように:UNIONは、内部結合としてリターンレコードセットを制限するために使用されているために戻さUNION-EDセットにJOINできるようにすることであるようにする必要がありますMS SQLで実行をテストすると、パフォーマンスが9分から30〜40秒に向上し、非常に大きな改善が得られます。私はOracleで同じ利益を得ることを望んでいました。
SELECT DISTINCT
c.Field1,
c.Field2,
D.Field3,
b.Field4,
b.Field5,
c.Field6,
c.Field7 || '-' || cds1.Field8 AS status,
b.paid,
cds.Field8,
p.Field9,
p.Field10,
c.Field11,
c.Field12 AS provider_name
FROM
header c,
(
SELECT
a.*,
cd.paid,
cd.Field15,
cd.BigList,
cd.allowed,
cd.copayment,
cd.coinsurance
FROM
header_detail cd,
(
SELECT
Field1,
Field4,
'' AS revenue_code,
Field20,
Field5,
Field14,
location_code,
ServiceList
FROM header_other_detail x1
WHERE x1.Field1 = cd.Field1 AND x1.Field14 = cd.Field14
UNION
SELECT
Field1,
Field4,
revenue_code,
Field20,
Field5,
Field14,
'' AS location_code,
ServiceList
FROM inst_claim_detail x2
WHERE x2.Field1 = cd.Field1 AND x2.Field14 = cd.Field14
) a
WHERE
a.Field1 = cd.Field1
AND cd.Field1 = c.Field1
AND a.Field20 = cd.Field20
AND a.Field14 = cd.Field14
AND cd.Field14 = c.Field14a
) b,
(
SELECT
Field1,
Field14,
Trim(
Trailing ',' FROM
ch.icd9_1 || ',' ||
ch.icd9_2 || ',' ||
ch.icd9_3 || ',' ||
ch.icd9_4 || ',' ||
ch.icd9_5 || ',' ||
ch.icd9_6 || ',' ||
ch.icd9_7 || ',' ||
ch.icd9_8 || ',' ||
ch.icd9_9 || ',' ||
ch.icd9_10 || ',' ||
ch.icd9_11 || ',' ||
ch.icd9_12
)
AS Field3
FROM prof_claim ch
WHERE ch.Field1 = c.Field1 AND ch.Field14 = c.Field14a
UNION
SELECT
Field1,
Field14,
Field3
FROM inst_claim x3
WHERE x3.Field1 = c.Field1 AND x3.Field14 = c.Field14a
) d,
(
SELECT
Field1,
Field14,
Field9,
Field10,
Field18,
refund_amount,
Field15
FROM payment_detail
) p,
(SELECT * FROM Codes WHERE code_type='19') cds,
(SELECT * FROM Codes WHERE code_type='28') cds1
WHERE
c.Field17 = 'T00000370'
AND c.Field1 = b.Field1 AND c.Field14a = b.Field14
AND c.Field1 = d.Field1 AND c.Field14a = d.Field14
AND b.Field14 = p.Field14(+) AND b.Field1 = p.Field1(+) AND b.Field15 = p.Field15(+)
AND b.BigList = cds.Field16(+) AND b.Field14 = cds.Field14(+)
AND c.Field7 = cds1.Field16(+) AND c.Field14a = cds1.Field14(+)
ORDER BY Field1;
Oracle 12cは、複数のレベルにわたる相関関係をサポートしています。すべての先行バージョンは1つのレベルのみです。 – Husqvik