我有兩個表tab1
和tab2
查找一個表中的行。 tab1
有39000條記錄,tab2
有15000條記錄。 tab1
和tab2
都有兩個公共列,分別爲item_number
,color_code
。但是在tab1
中,color_code
可能爲空,但不在tab2
中。 item_number
在兩個表中都不爲空。在tab2
我必須從tab1
插入一行(基於兩列的唯一行)數據。爲此我寫了一個這樣的程序。它會比較每一行,但它花費的時間太長。有什麼方法可以提高性能嗎?第一取兩個光標:使用另一個表列數據
CURSOR CUR_tab1 IS SELECT item_number,color_code FROM
(SELECT item_number,color_code, SNO RID ,
MIN(SNO) OVER(partition BY item_number,color_code)
MIN_RID FROM tab1 ) WHERE RID= MIN_RID;
CURSOR CUR_tab2 IS SELECT sno_2,item_number,color_code,PRIORITY FROM tab2;
son
,sno_2
在tab1
和tab2
主鍵。
要查找一個表中的記錄我使用的是for loop
。
SELECT NVL(MAX(SNO_2),0) INTO SNO_COUNT FROM tab2;
FOR CUR_tab1 IN CUR_NIIN_CAGE
LOOP
-- GET THE NIIN_CAGE_PART RECORDS DATA.
OLD_NNCGP_NIIN := CUR_tab1 .item_number;
OLD_NNCGP_HCC := CUR_tab1 .color_codeC;
IF (SNO_COUNT>0 AND OLD_NNCGP_HCC IS NOT NULL) THEN -- IF RECORDS EXISTS IN DB
FOR CUR_tab2 IN CUR_NIIN_HCC
LOOP
OLD_NIIN := CUR_tab2.item_number;
OLD_HCC := CUR_tab2.color_codeC;
NIIN_PRIORITY := CUR_tab2.PRIORITY;
IF (trim(OLD_NNCGP_NIIN) = trim(OLD_NIIN)
AND trim(OLD_NNCGP_HCC)=trim(OLD_HCC)) THEN
-- DO NOTHING
ROW_COUNT:=0;
PROCESSED :=FALSE;
EXIT;
ELSE
ROW_COUNT:=ROW_COUNT+1;
PROCESSED :=TRUE;
END IF;
END LOOP;
ELSIF (SNO_COUNT=0 AND OLD_NNCGP_HCC IS NOT NULL) THEN
PROCESSED :=TRUE;
ROW_COUNT:=ROW_COUNT+1;
END IF;
IF ( PROCESSED) THEN
SNO_COUNT :=SNO_COUNT+1;
INSERT INTO tab2("SNO2","color_code","item_number","PRIORITY")
values (SNO_COUNT,OLD_NNCGP_HCC,OLD_NNCGP_NIIN,NULL);
COMMIT;
END IF;
PROCESSED:=FALSE;
ROW_COUNT:=0;
END LOOP;
但是這需要將近7分鐘。有沒有更好的方法來比較列?
我想兩列與其他表中的一個表進行比較。如果找不到,請插入它們。如果發現更新第三列值。 – mallikarjun 2012-07-25 18:19:26