2017-08-16 77 views
0

我可以重新排列下面的查詢以任何其他形式嗎?where子句中的子串函數吃CPU時間

SELECT 
    ELIG_TYP 
FROM TABLE1 
WHERE COMPANY_CD IN 
    (SELECT SUBSTR(CMPNYID, 1, 4) FROM TABLE2 WHERE USR = 'Badshah') 
+0

理想的情況是加入兩個表格的公司領域可以,而不需要求助於子串操作。就目前來看,我認爲你不能使用索引來進行這樣的連接。您可能需要考慮更改「TABLE2」的設計,以使直接連接成爲可能。 –

+0

@TimBiegeleisen謝謝蒂姆 – user6583386

+0

我的代碼不工作? – Esperento57

回答

0

你可以用做加盟:

SELECT ELIG_TYP 
FROM TABLE1 
     INNER JOIN TABLE2 ON TABLE1.COMPANY_CD = LEFT(TABLE2.CMPNYID, 4) 
          AND USR = 'Badshah' 
+0

但是這也不能使用我認爲的索引,並且可能不會比OP更快。 –

+0

嘗試使用** LEFT(TABLE2.CMPNYID,4)**,因爲我編輯了上面的查詢。 –

+0

取決於Db2平臺和版本... IBM i的Db2允許您在LEFT(CMPNYID,4)上創建派生索引。 – Charles

0

嘗試用一個存在:

SELECT f1.ELIG_TYP 
FROM TABLE1 f1 
WHERE exists 
( 
    SELECT * FROM TABLE2 f2 
    WHERE f2.USR = 'Badshah' and substr(f2.CMPNYID, 1, 4)=f1.COMPANY_CD 
) 

,或者如果你有仍然PERF的問題的嘗試可能是這樣的:

SELECT f1.ELIG_TYP 
FROM TABLE1 f1 
WHERE exists 
( 
    SELECT * FROM TABLE2 f2 
    WHERE f2.USR = 'Badshah' and f2.CMPNYID like f1.COMPANY_CD || '%' 
)