使用SQL Developer更改Oracle存儲過程。重寫NOT IN,但子查詢使用逗號分隔的字符串(ID)
輸入:用逗號分隔的ID。 (例如:'P23,P37,P39,P45') 編輯:請注意輸入是一個字符串,不是的一個字符串數組。此外,字符串可能不僅僅是4個ID。可能高達約200.
想從表中找出沒有這些輸入ID的表。
以下是太慢了。只有大約300行數據(在表中),但大約需要20秒。所以我想重寫。請給我一些關於如何去做的提示。
ID_Array是'P23,P37,P39,P45'。
SELECT * FROM StudentInfo
WHERE StudentClass = 'Primary5A'
AND StudentID NOT IN
(
SELECT REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) StudentID
FROM DUAL
CONNECT BY REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) IS NOT NULL
)
AND Height <= 150;
你們有些人可能已經知道了。下面
SELECT REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) StudentID
FROM DUAL
CONNECT BY REGEXP_SUBSTR(ID_Array, '[^,]+', 1, LEVEL) IS NOT NULL
會變成ID_Array爲表(表樣結構?)有四行:
+-----+
| P23 |
| P37 |
| P39 |
| P45 |
+-----+
如果您對其進行硬編碼,需要多長時間:AND StudentID NOT IN('P23','P37','P39','P45')和高度<= 150'?兩者的執行計劃都顯示了什麼?你的統計數據是最新的嗎? –
由於您使用的是字符串而不是表格,因此拆分逗號分隔字符串的各種方法之間幾乎沒有區別。我認爲Alex的建議還有其他錯誤。 – Ben
我硬編碼的字符串。執行計劃:基數:184,成本:191使用_real_數據。它在StudentInfo上進行全表掃描。使用下面的答案,兩個執行計劃都非常低(如成本:5)。 – user3454439