检查WHERE子句中的多个值SQL查询REGEXP_LIKE Oracle 11g
问题描述:
如果在复杂查询中使用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)
答
如果你想更快地得到结果,然后不使用LISTAGG
和REGEXP_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');
答
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';
第一执行查询采取的输出并使用这些输出,用于第二,第三查询输入。 (从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