优化大量排除的请求

时间:2014-03-07 16:11:46

标签: sql

我有一个庞大而肮脏的SQL请求做了许多排除,我感到很难过。也许,你知道一种更好的方法。

以下是我的要求的一部分:

select name, version, iteration, score
    from article, articlemaster
    where article.idmaster = articlemaster.id
            and article.id not in (select article.id
                                from article, spsarticlemaster
                                where article.idmaster = articlemaster.id
                                and articlemaster.name = 'nameOfMyArticle'
                                and article.version = 'A'
                                and article.state = 'CONTINUE')
            and article.id not in....
            and article.id not in....
你觉得它看起来不那么糟糕吗?实际上,这只是请求的一部分,“和spsarticle.id不在....”排除了一篇文章,我有超过1000个要排除,所以我使用java程序追加其他999

任何想法我怎么能对这种可憎的事情做一个简单的版本?

2 个答案:

答案 0 :(得分:2)

最好将所有文章加载到临时表中,然后将该表加入查询中。

例如,创建exclude_articles

name            version   state
----            -------   -----
nameOfMyArticle A         CONTINUE

然后从查询中排除其结果:

select
    article.name,
    article.version,
    article.iteration,
    article.score
from
    article
    join articlemaster
         on article.idmaster = articlemaster.id
where
    not exists (
        select 1
          from article article2
               join articlemaster articlemaster2
                    on article2.idmaster = articlemaster2.id
               join exclude_articles
                    on articlemaster2.name = exclude_articles.name
                    and article2.version = exclude_articles.version
                    and article2.state = exclude_articles.state
         where article.id = article2.id)

这都假设versionstate实际上是排除逻辑所必需的。如果名称是唯一的,那将是一个更容易的案例。

答案 1 :(得分:-1)

如果您使用Java创建查询并处理结果,那么为什么不在Java中执行所有复杂的逻辑?只需向数据库询问符合某些基本标准的所有文章(或者您真的想要阅读所有文章),然后过滤结果:

select am.name, a.version, a.iteration, a.score, a.state
from   article a, articlemaster am
where  a.idmaster = am.id
  and  <some other basic criteria>

然后在Java循环中查看所有结果(抱歉,我的Java非常生疏)并过滤掉你不想要的结果:

ArrayList recordList = ArrayList();
ArrayList finalList = ArrayList();
for (record in recordList) {
    if (! filterThisRecord(record)) {
        finalList.append(record);
    }
}
相关问题