Oracle SQL Developerを使用していて、次のようなクエリを実行しようとしています
SELECT * FROM
(SELECT id1 CONTRACT_ID1, id2 CONTRACT_ID2 FROM contract_table)
LEFT JOIN
(SELECT id1 A_CONTRACT_ID, id2 A_SPECIAL_CONTRACT_ID from special_contract_table_a)
on (CONTRACT_ID1 = A_CONTRACT_ID)
LEFT JOIN
(SELECT id1 B1_CONTRACT_ID, id2 B1_DOCUMENT_ID from document_table_b1)
ON (CONTRACT_ID2 = B1_CONTRACT_ID)
LEFT JOIN
(SELECT id1 B2_CONTRACT_ID, id2 B2_DOCUMENT_ID from document_table_b2)
ON (A_SPECIAL_CONTRACT_ID = B2_CONTRACT_ID)
LEFT JOIN
(SELECT id1 B3_CONTRACT_ID, id2 B3_DOCUMENT_ID from document_table_b3)
ON (A_SPECIAL_CONTRACT_ID = B3_CONTRACT_ID)
LEFT JOIN
(SELECT page PAGE, id1 C1_DOCUMENT_ID, id2 C2_DOCUMENT_ID, id3 C3_DOCUMENT_ID from page_table_c)
ON (C1_DOCUMENT_ID = B1_DOCUMENT_ID OR C2_DOCUMENT_ID = B2_DOCUMENT_ID OR C3_DOCUMENT_ID = B3_DOCUMENT_ID)
LEFT JOIN
(SELECT id2 B1_DOCUMENT_ID_2 from, status B1_DOCUMENT_STATUS from document_table_b1)
ON (C1_DOCUMENT_ID = B1_DOCUMENT_ID_2)
LEFT JOIN
(SELECT id2 B2_DOCUMENT_ID_2 from, status B2_DOCUMENT_STATUS from document_table_b2)
ON (C2_DOCUMENT_ID = B2_DOCUMENT_ID_2)
LEFT JOIN
(SELECT id2 B3_DOCUMENT_ID_2 from, status B3_DOCUMENT_STATUS from document_table_b3)
ON (C3_DOCUMENT_ID = B3_DOCUMENT_ID_2)
;
つまり、基本的には、2つのベースIDを選択し、関連するすべてのグループのすべてのメンバーを取得してから、それらの各メンバーのステータスを取得します(ステータスはグループ宣言内に保存されます)。これは、私が使用している限り、期待どおりに機能しますSELECT * FROM
。これを変更するとSELECT CONTRACT_ID1, PAGE, B1_DOCUMENT_STATUS, B2_DOCUMENT_STATUS, B3_DOCUMENT_STATUS
、出力は24行から4行に折りたたまれ、の一致のみが表示されdocument_table_b1
ます。
これを修正する方法はありますか?
追加情報:DBバージョンはOracle10gです。OracleSQLDeveloperのバージョンは3.2.09です。AutotraceとExplainplanを比較すると、両方のselectステートメントで( Explainplan)からID_1(+) = ID_2
(Autotrace)への一部のアクセス述部の違いがわかります。ID_1 = ID_2
クエリオプティマイザがここで失敗しているのではないかと思います。私はまだその設定をいじくり回す方法を見つけていません。その方向への入力が役立つ場合があります。