PLSQL избегает дублирования кода - PullRequest
0 голосов
/ 16 сентября 2011

Мне нужно выбрать из всех пользователей, которых нет в наборе других подзапросов:

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 ]

2 голосов
/ 16 сентября 2011

Как насчет создания представления для каждого сложного подзапроса, который вы хотите использовать повторно?

2 голосов
/ 16 сентября 2011

Как насчет хранения всех неверных идентификаторов пользователей в индексированной временной таблице, из которой вы можете фильтровать?

0 голосов
/ 23 сентября 2011

Я бы сказал, что это так:

Попытайтесь думать об этом в обратной логике, как это

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

Дайте мне знать, как это происходит

Ура, Алекс

...