2017-10-10 210 views
0

如果在複雜查詢中使用REGEXP_LIKE,則執行時間很長,您能否爲此提供備用解決方案。檢查WHERE子句中的多個值SQL查詢REGEXP_LIKE Oracle 11g

從一個查詢中獲取值的列表,並應該只使用這些值到另一個查詢的WHERE子句

LV_TRANS_TYPES_IDS VARCHAR2(4000); 


    SELECT LISTAGG(TRANSACTION_TYPE_ID, '|') WITHIN GROUP(ORDER BY 1) 
    INTO LV_TRANS_TYPES_IDS 
    FROM MTL_TRANSACTION_TYPES 
    WHERE TRANSACTION_TYPE_NAME IN 
     (SELECT MEANING 
      FROM FND_LOOKUP_VALUES_VL 
      WHERE LOOKUP_TYPE = 'LOOKUPNAME'); 

- 它會返回多個值如2 | 38 | 45 | 60

LV_TRANS_TYPES_IDS := '^(' || LV_TRANS_TYPES_IDS || ')$'; 

- 分配^(2 | 38 | 45 | 60)$通過這個值,以下面的查詢

SELECT COUNT(*) 
    INTO LN 
    FROM MTL_TRANSACTION_TYPES 
    WHERE 1 = 1 
    AND REGEXP_LIKE(TRANSACTION_TYPE_ID, LV_TRANS_TYPES_IDS); 

第一執行噸他查詢獲取輸出並將這些輸出用於第二個,第三個查詢輸入。像(從表1中選擇F1,F2,其中REGEXP_LIKE(TRANSACTION_TYPE_ID,LV_TRANS_TYPES_IDS)UNION ALL UNION ALL選擇F1,從表3,其中REGEXP_LIKE(TRANSACTION_TYPE_ID,LV_TRANS_TYPES_IDS)F2)

+0

第一執行查詢採取的輸出並使用這些輸出,用於第二,第三查詢輸入。 (從table1中選擇f1,f2,其中REGEXP_LIKE(TRANSACTION_TYPE_ID,LV_TRANS_TYPES_IDS)union all union all select f1,from table2 where f2,其中REGEXP_LIKE(TRANSACTION_TYPE_ID,LV_TRANS_TYPES_IDS)) – Chidam

回答

1

如果你想更快地得到結果,然後不使用LISTAGGREGEXP_LIKE

只是:

SELECT COUNT(*) 
INTO LN 
FROM MTL_TRANSACTION_TYPES 
WHERE TRANSACTION_TYPE_NAME IN 
     (SELECT MEANING 
      FROM FND_LOOKUP_VALUES_VL 
      WHERE LOOKUP_TYPE = 'LOOKUPNAME'); 
0
SELECT COUNT(*) 
INTO LN 
FROM MTL_TRANSACTION_TYPES mtt 
JOIN 
FND_LOOKUP_VALUES_VL flvv 
ON mtt.TRANSACTION_TYPE_NAME = flvv.MEANING 
AND flvv.LOOKUP_TYPE = 'LOOKUPNAME';