2017-10-10 5 views
0

複雑なクエリでREGEXP_LIKEを使用すると実行に非常に時間がかかる場合は、代わりのソリューションを提供できますか?WHERE句の複数の値を確認するSQLクエリREGEXP_LIKE Oracle 11g

が1つのクエリから値の一覧を取得し、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); 

最初に実行トン彼はクエリを出力し、2番目、3番目のクエリの入力にそれらの出力を使用します。 (、TABLE1 REGEXP_LIKE(TRANSACTION_TYPE_ID、LV_TRANS_TYPES_IDS)組合からF1、F2、すべての組合すべてを選択し、F1を選択しREGEXP_LIKE(TRANSACTION_TYPE_ID、LV_TRANS_TYPES_IDS)表3からF2)のようなあなたがより速く結果を取得したい場合

+0

最初のクエリが出力を取り、第二、第三のクエリの入力のためのそれらの出力を使用して実行します。 (REGISP_LIKE(TRANSACTION_TYPE_ID、LV_TRANS_TYPES_IDS))が選択されているテーブル3からのf1、f2を選択します(REGEXP_LIKE(TRANSACTION_TYPE_ID、LV_TRANS_TYPES_IDS))。 – Chidam

答えて

1

が、その後、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'); 
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';