2017-10-10 127 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';