表1からサブクエリでテーブルを結合するクエリ内のテーブル(表2)のいずれかに問題がある、私は、クエリに参加する複数有するオラクルが効率的
| account_no | TX_No | Balance | History |
+------------+-------+---------+------------+
| 1 | 123 | 123 | 12.01.2011 |
| 1 | 234 | 2312 | 01.03.2011 |
| 3 | 232 | 212 | 19.02.2011 |
| 4 | 117 | 234 | 24.01.2011 |
:
| account_no | **other columns**...
+------------+-----------------------
| 1 |
| 2 |
| 3 |
| 4 |
表2それは他の多くのものを計算するビューなので、そのテーブルに対する各クエリはコストがかかるのです。表2から、私は最大のTX_NO
で行全体を必要とし、表1の各account_no
のために、これは私がそれを行う方法です。
SELECT * FROM TABLE1 A LEFT JOIN
(SELECT
X.ACCOUNT_NO,
HISTORY,
X.BALANCE
FROM TABLE2 X INNER JOIN
(SELECT
ACCOUNT_NO,
MAX(TX_NO) AS TX_NO
FROM TABLE2
GROUP BY ACCOUNT_NO) Y ON X.ACCOUNT_NO = Y.ACCOUNT_NO) B
ON B.ACCOUNT_NO = A.ACCOUNT_NO
私が最初に理解したようには、内側には内のすべての行のために参加するようになりますテーブル2とそれ以降は、参加する必要がありますaccount_no
のテーブル1これは私が避けたいものです。
私の質問:max(TX_NO)
は、にあるアカウントのみを検索する方法はありますか?テーブル1をすべて経由するのではなく、私はそれがクエリの速度を向上させるのに役立つだろうと思う。
かなりの減少がResultSetだろうし、それから最新のトランザクションIDのレコードを選ぶ最初の参加やって考えることができ素晴らしいアイデアは、ウィンドウの機能について考える必要があります、私は試してみます – Hatik
はい、それは半分に時間を短縮し、私は素晴らしい見つける。唯一のことは、あなたのクエリのようなウィンドウ関数を実行することによって、 'ORA-30483:ウィンドウ関数はここでは許されません.'エラーが出るということです。それで私は最初に 'ROW_NUMBER().. as rn'をサブクエリーとして別の選択肢を選択し、standart' where rn = 1'を使用しました。 – Hatik
@Hatikはい、あなたは正しいです、私は私の答えを更新しました。サンプル・データがあまりなく、SQLFiddleとRextesterの両方でOracleをテストするのも難しいです。 –