如何在很多列上避免分组

时间:2011-03-30 13:08:07

标签: sql sql-server-2008

我有两张大桌子

- 主表A:1.4百万行
- 详细表B:900万行

B有A的外键。

基本上我需要表A +中的所有25个细节字段,在这种情况下是B的计数。

现在我有以下伪查询:

Select
       A.field1,
       A.field2,
       ...
       A.field25,
       Count(b.id)
 from
       A left outer join B on B.fkAid = A.id
 Group by 
       A.id,
       A.field1,
       A.field2,
       ...
       A.field25
Order by A.field1  

查询计划显示分组需要花费大量时间(毫不奇怪)。

有没有更有效的方法来做这种选择?

3 个答案:

答案 0 :(得分:3)

如何使用公用表表达式(您将其标记为SQL Server 2008?)

WITH CountB AS
(
    SELECT A.aId, value= Count(*)
    FROM A left outer join B on B.fkAid = A.id
    GROUP BY A.id
)
Select
   A.field1,
   A.field2,
   ...
   A.field25,
   CountB.value
from
   A left outer join CountB on A.id = CountB.aId
Order by A.field1  

答案 1 :(得分:2)

您可以尝试使用相关子查询 - 但效率可能更低:

Select
       A.field1,
       A.field2,
       ...
       A.field25,
       (select Count(*) from B where B.fkAid = A.id)
 from
       A
Order by A.field1

如果没有WHERE子句,我实际上期望左连接和分组更有效,除非表A中的列非常宽。

另一种可能性是:

Select
       A.field1,
       A.field2,
       ...
       A.field25,
       Coalesce(b.Cnt,0)
 from
       A left join
       (select fkAid,COUNT(*) from B group by fkAId) b (ID,Cnt)
       on A.ID = b.ID
Order by A.field1

在没有涉及where子句的情况下,这可能是最好的。

答案 2 :(得分:0)

您可以尝试使用OUTER APPLY

Select
       A.field1,
       A.field2,
       ...
       A.field25,
       C.Quant
 from
       A OUTER APPLY (SELECT COUNT(*) Quant FROM B WHERE A.id = B.fkAid) AS C
Order by A.field1