2011-09-16 98 views
0

我需要不存在一組其他子查詢的所有用戶選擇:PLSQL避免代碼重複

SELECT user_id 
FROM (<userSubQuery1>) 
WHERE 
    user_id NOT IN (<badUserSubQueryA>) AND 
    user_id NOT IN (<badUserSubQueryB>) AND 
    user_id NOT IN (<badUserSubQueryC>) 

只有我需要做NOT IN過濾器在許多不同的查詢,其中userSubQuery和badUserSubQueries可能會有所不同。例如:

SELECT user_id 
FROM (<userSubQuery2>) 
WHERE 
    user_id NOT IN (<badUserSubQueryB>) AND 
    user_id NOT IN (<badUserSubQueryC>) AND 
    user_id NOT IN (<badUserSubQueryD>) 

所有的子查詢,無論我是從選擇和在不在使用一次的那些很複雜,所以我不希望複製的而不是代碼中的子查詢通常是相同的(在我的例子中,badUserSubQueryB和badUserSubQueryC)。

我可以用動態sql實現這一點,但我寧願不,如果我能避免它。可能嗎?

回答

2

如何將所有不良用戶ID存儲在可以從中過濾的索引臨時表中?

+1

因爲它是oracle,你也可以爲每個子查詢使用物化視圖。 – Joe

+0

如何不使用性能影響和資源耗盡實現來解決開發過程中實際存在的問題? – APC

+0

我認爲有一個函數返回一個plsql集合,其中包含所有badUserSubQueries結果的聯合。那麼如何將性能比較放在臨時表中呢? –

2

如何爲要複用的每個複雜子查詢創建視圖?

+0

如果我也把userSubQuery放在一個視圖中,這將有所幫助。但我仍然需要爲每個組合提供單獨的查詢(儘管更簡單)。 –

0

我想它有裂紋這樣的:

儘量想這個反向邏輯是這樣

SELECT user_id 
FROM (<userSubQuery1>) 
MINUS 
(
SELECT useri_id 
    FROM <badUserSubQueryB> 
UNION 
SELECT useri_id 
    FROM <badUserSubQueryC> 
UNION 
SELECT useri_id 
    FROM <badUserSubQueryD> 
) 

讓我知道如何去

乾杯, 亞歷克斯