1

我们有一个包含 10000 条记录的主表,其中 5000 条记录为status=completed5000 条记录status=incompleted

该应用程序维护不同类别的人......比如说users,visitors,admin..

访问者非常少(比如 200 条记录)......当他们购买某些东西时appid,应用程序中的状态会更新为状态 = 已完成。

我们需要appid那些拥有status!=completed

我知道直接的方式是好的表现..(下一个)

select appid 
from application 
where status != completed and appid in (select appid from visitors)

appid还包含在访问者和应用程序中。因为应用程序包含 5000 个已完成和 5000 个未完成

NOT IN (select appid from application where status=completed)也与IN (select appid from application where status=incompleted)

select v.appid 
from visitors v 
where v.appid not in (select appid from application where status = completed)

我的第二个查询是否提供与第一个查询相同的性能..

如果NOT IN执行是这样的..那么它是..

我在下面写声明。

for each v.appid in visitors{ 
  do not select the v.appid if v.appid is in by firing the query as below.

    select appid 
    from application 
    where appid = v.appid and status = completed
}

第二个查询是否会触发我提到的上述过程...

为了提供与第一个查询相同的更好性能,我可以编写以下内容吗?

select v.appid 
from visitors v 
where v.appid not in (select appid 
                      from application 
                      where status = completed and appid = v.appid)

如何编写第二个查询以使其执行与第一个查询相同的级别?

4

2 回答 2

3

尝试使用 NOT EXISTS 条件:

select v.appid 
from visitors v 
where not exists
(select 1
 from application a
 where a.status = 'completed' and a.appid = v.appid)
于 2013-05-11T07:13:13.937 回答
0

改用 JOINS 使查询更具可读性和效率。第一个查询将转换为:

select 
      a.appid 
from 
      application a INNER JOIN 
      visitors v ON a.appid = v.appid 
where 
      a.status!='completed'

对于当前的数据库服务器,就性能而言,除非您拥有大量行和许多表,否则这并不重要。

于 2013-05-11T05:58:28.840 回答