You Asked
We have a dimension table in which one column has mutlipul values like an Array.
I have to get all this individual values and should compare against a lookup table, if the value does not exist in the look up table
then i have to insert this value into lookup table along with an id,here the id should be sequence(select max(id)+1 from lookup table)
DIM TABLE:
CREATE TABLE TEST0922(CODE VARCHAR2(2000));
INSERT INTO TEST0922 VALUES('["REJECT","APPRVOE","HOLD","RESEARCH","REJECT","APPRVOE","HOLD","RESEARCH","REJECT","HOLD","ANALYSIS"]');
INSERT INTO TEST0922 VALUES('["REJECT","APPRVOE","HOLD","RESEARCH","REJECT","APPRVOE","HOLD","RESEARCH","REJECT","HOLD","TEST123"]');
COMMIT;
LOOKUP TABLE:
CREATE TABLE TEST_LOOKUP0922(ID NUMBER,CODE VARCHAR2(30));
INSERT INTO TEST_LOOKUP0922 VALUES(1,'REJECT');
INSERT INTO TEST_LOOKUP0922 VALUES(2,'APPRVOE');
INSERT INTO TEST_LOOKUP0922 VALUES(3,'HOLD');
commit;
I am using below query inside a procedure to get the values not in lookup table and then inserting these values.
ELECT CODE FROM TEST0922;
WITH T AS
(SELECT REPLACE(REGEXP_SUBSTR(CODE,'("[^"\]*\"+)', 1, LEVEL), '"', '') COL1
FROM
( SELECT CODE FROM TEST0922
)
--CONNECT BY LEVEL <= REGEXP_COUNT(audit_ruleaction, ',')+1
CONNECT BY level <=regexp_count(CODE,'("[^"\]*\"+)')
) SELECT DISTINCT COL1 FROM T WHERE COL1 NOT IN (SELECT CODE FROM TEST_LOOKUP0922);
But this query is running more than 45mins against just 250 rows in DIM table, but my actual Production environment will get 100k to 200k records on daily basis.
So please suggest any better query/approach as early as possible;
and Connor said...
Always test your components before bringing them all together - lets start with just the segmenting out of the labels first
SQL> CREATE TABLE TEST0922(CODE VARCHAR2(2000));
Table created.
SQL> INSERT INTO TEST0922 VALUES('["REJECT","APPRVOE","HOLD","RESEARCH","REJECT","APPRVOE","HOLD","RESEARCH","REJECT","HOLD","ANALYSIS"]');
1 row created.
SQL> INSERT INTO TEST0922 VALUES('["REJECT","APPRVOE","HOLD","RESEARCH","REJECT","APPRVOE","HOLD","RESEARCH","REJECT","HOLD","TEST123"]');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT REPLACE(REGEXP_SUBSTR(CODE,'("[^"\]*\"+)', 1, LEVEL), '"', '') COL1
2 FROM TEST0922
3 CONNECT BY level <=regexp_count(CODE,'("[^"\]*\"+)');
COL1
----------------------------------------------------------------------------------------
REJECT
APPRVOE
HOLD
RESEARCH
REJECT
APPRVOE
HOLD
RESEARCH
..
...
TEST123
HOLD
ANALYSIS
TEST123
4094 rows selected.
I'm pretty sure you didnt plan on getting 4094 rows back ... which of course will cause all sorts of problems. So we will fix that
SQL> SELECT tst.rowid r, tag
2 from TEST0922 tst,
3 lateral
4 ( select REPLACE(REGEXP_SUBSTR(tst.CODE,'("[^"\]*\"+)', 1, LEVEL), '"', '') tag
5 FROM dual
6 CONNECT BY level <=regexp_count(tst.CODE,'("[^"\]*\"+)')
7 );
R TAG
------------------ ------------------------------
AAAlUQAAHAAAT6/AAA REJECT
AAAlUQAAHAAAT6/AAA APPRVOE
AAAlUQAAHAAAT6/AAA HOLD
AAAlUQAAHAAAT6/AAA RESEARCH
AAAlUQAAHAAAT6/AAA REJECT
AAAlUQAAHAAAT6/AAA APPRVOE
AAAlUQAAHAAAT6/AAA HOLD
AAAlUQAAHAAAT6/AAA RESEARCH
AAAlUQAAHAAAT6/AAA REJECT
AAAlUQAAHAAAT6/AAA HOLD
AAAlUQAAHAAAT6/AAA ANALYSIS
AAAlUQAAHAAAT6/AAB REJECT
AAAlUQAAHAAAT6/AAB APPRVOE
AAAlUQAAHAAAT6/AAB HOLD
AAAlUQAAHAAAT6/AAB RESEARCH
AAAlUQAAHAAAT6/AAB REJECT
AAAlUQAAHAAAT6/AAB APPRVOE
AAAlUQAAHAAAT6/AAB HOLD
AAAlUQAAHAAAT6/AAB RESEARCH
AAAlUQAAHAAAT6/AAB REJECT
AAAlUQAAHAAAT6/AAB HOLD
AAAlUQAAHAAAT6/AAB TEST123
22 rows selected.
Now we can move onto the lookup and that will run a lot better
SQL> CREATE TABLE TEST_LOOKUP0922(ID NUMBER,CODE VARCHAR2(30));
Table created.
SQL> INSERT INTO TEST_LOOKUP0922 VALUES(1,'REJECT');
1 row created.
SQL> INSERT INTO TEST_LOOKUP0922 VALUES(2,'APPRVOE');
1 row created.
SQL> INSERT INTO TEST_LOOKUP0922 VALUES(3,'HOLD');
1 row created.
SQL> commit;
Commit complete.
SQL> WITH T AS
2 (
3 SELECT tag
4 from TEST0922 tst,
5 lateral
6 ( select REPLACE(REGEXP_SUBSTR(tst.CODE,'("[^"\]*\"+)', 1, LEVEL), '"', '') tag
7 FROM dual
8 CONNECT BY level <=regexp_count(tst.CODE,'("[^"\]*\"+)')
9 )
10 )
11 SELECT DISTINCT tag FROM T WHERE tag NOT IN (SELECT CODE FROM TEST_LOOKUP0922);
TAG
------------------------------
TEST123
ANALYSIS
RESEARCH
3 rows selected.
SQL>
Rating
(2 ratings)
Is this answer out of date? If it is, please let us know via a Comment