2011-09-16 169 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> 
) 

让我知道如何去

干杯, 亚历克斯