比较查询需要年龄

时间:2012-04-06 08:17:33

标签: sql tsql comparison sql-server-2008-r2

我的查询非常简单:

select  a.ID, a.adres, a.place, a.postalcode  
from COMPANIES a, COMPANIES b  
where a.Postcode = b.Postcode  
and a.Adres = b.Adres  
and (  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=a.ID  
)>(  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=b.ID  
)

数据库:sql server 2008 r2

我正在尝试做什么: COMPANIES表包含双重条目。我想知道连接到最多用户的那些。所以我只需要更改那些最少的外键。 (我已经知道双打的身份)

现在需要花费很多时间才能完成。我想知道是否可以更快地完成

3 个答案:

答案 0 :(得分:3)

试试这个版本。它应该只是快一点。 COUNT非常慢。我添加了a.ID <> b.ID以避免更少的情况。

select  a.ID, a.adres, a.place, a.postalcode  
from COMPANIES a INNER JOIN COMPANIES b
ON
a.ID <> b.ID
and a.Postcode = b.Postcode  
and a.Adres = b.Adres  
and (  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=a.ID  
)>(  
select COUNT(COMPANYID)  
from USERS  
where COMPANYID=b.ID  
)

FROM ... INNER JOIN ... ON ...是连接表的首选SQL构造。它也可能更快。

答案 1 :(得分:0)

一种方法是在进行连接之前预先计算COMPANYID计数,因为您将在主查询中重复计算它。例如:

insert into @CompanyCount (ID, IDCount)
select COMPANYID, COUNT(COMPANYID)
from USERS
group by COMPANYID

然后你的主查询:

select a.ID, a.adres, a.place, a.postalcode
from COMPANIES a
  inner join @CompanyCount aCount on aCount.ID = a.ID
  inner join COMPANIES b on b.Postcode = a.Postcode and b.Adres = a.Adres
  inner join @CompanyCount bCount on bCount.ID = b.ID and aCount.IDCount > bCount.IDCount

如果您想要a的所有实例,即使没有相应的b,那么您需要left outer joinbbCount

但是,您需要查看查询计划 - 您正在使用哪些索引 - 您可能希望将它们放在ID以及PostcodeAdres字段中因为你加入了它们。

答案 2 :(得分:0)

  1. 在邮政编码和地址上建立索引

  2. 数据库可能会为每一行执行子选择。 (只是在这里猜测,非常在解释计划中。如果是这种情况,你可以重写查询以加入内联视图(注意这是它在oracle hop中看起来如何在sql server中工作):

    select distinct a.ID, a.adres, a.place, a.postalcode  
    from 
        COMPANIES a, 
        COMPANIES b,  
    (
        select COUNT(COMPANYID) cnt, companyid  
        from USERS
        group by companyid) cntA,  
    (
        select COUNT(COMPANYID) cnt, companyid  
        from USERS
        group by companyid) cntb   
    where a.Postcode = b.Postcode  
    and a.Adres = b.Adres  
    and a.ID<>b.ID
    and cnta.cnt>cntb.cnt