PLSQL避免代码重复

时间:2011-09-16 14:23:06

标签: sql oracle plsql dynamic-sql

我需要从一组其他子查询中不存在的所有用户中进行选择:

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可能不同。 E.g:

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

我所选择的所有子查询和NOT IN中曾经使用过的查询都很复杂,因此我不想复制通常相同的NOT IN子查询的代码(badUserSubQueryB和我的例子中的badUserSubQueryC。)

我可以通过动态sql来实现这一点,但如果我能避免它,我宁愿不这样做。有可能吗?

3 个答案:

答案 0 :(得分:2)

如何将所有不良用户ID存储在可以过滤的索引临时表中?

答案 1 :(得分:2)

如何为要重用的每个复杂子查询创建视图?

答案 2 :(得分:0)

我会像这样对它进行攻击:

尝试以这样的反向逻辑来考虑这个

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

让我知道它是怎么回事

干杯, 亚历