I need to do multiple joins like below query.Have around 200 CAT_CODE.
Primary Table(PRIM):
NUM CAT1_CODE CAT2_CODE CAT3_CODE
A 1 y q
B 2 e a
C 3 s z
Secondary Table(LOV):
CATEGORY COLUMN_LKP EXT_CODE
CAT1_CODE 1 AB
CAT1_CODE 2 CD
CAT1_CODE 3 HI
CAT2_CODE y JL
CAT2_CODE e QD
CAT2_CODE s AH
CAT3_CODE q CD
CAT3_CODE a MS
CAT3_CODE z EJ
REQUIRED OUTPUT:
NUM CAT1 CAT2 CAT3
A AB JL CD
B CD QD MS
C HI AH EJ
SQL:
I have written a simple query to accomplish this task. Do you think, this would be right approach? Any other ways, to improve this query? Right now, I'm using both Oracle and Postgres.
SELECT
NUM,
(SELECT EXT_CODE FROM TEST_LOV
WHERE CATEGRY='CAT1_CODE' AND COLUMN_LKP=A.CAT1_CODE) CAT1,
(SELECT EXT_CODE FROM TEST_LOV
WHERE CATEGRY='CAT2_CODE' AND COLUMN_LKP=A.CAT2_CODE) CAT2,
(SELECT EXT_CODE FROM TEST_LOV
WHERE CATEGRY='CAT3_CODE' AND COLUMN_LKP=A.CAT3_CODE) CAT3
FROM
TEST_PRIM A
TEST_LOV is scanned multiple times.
Query Plan:
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 24 | 17 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TEST_LOV | 1 | 15 | 3 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| TEST_LOV | 1 | 15 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| TEST_LOV | 1 | 15 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| TEST_PRIM | 3 | 24 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("CATEGRY"='CAT1_CODE' AND "COLUMN_LKP"=:B1)
2 - filter("CATEGRY"='CAT2_CODE' AND "COLUMN_LKP"=:B1)
3 - filter("CATEGRY"='CAT3_CODE' AND "COLUMN_LKP"=:B1)