我有一个庞大而肮脏的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
任何想法我怎么能对这种可憎的事情做一个简单的版本?
答案 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)
这都假设version
和state
实际上是排除逻辑所必需的。如果名称是唯一的,那将是一个更容易的案例。
答案 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);
}
}