查询表1的所有列左连接和表2的计数

时间:2018-12-01 13:58:01

标签: sql sql-server select sql-server-2012 count

我无法使该查询生效:

不起作用

select 
    Region.*, count(secteur.*) count 
from  
    Region 
left join 
    secteur on secteur.region_id = Region.id

我找到的解决方案是这个,但是有没有使用联接的更好解决方案,或者如果这不影响性能,因为我有一个非常大的数据集,大约有50万行

工作却避免了性能问题

select 
    Region.*,
    (select count(*) 
     from Secteur 
     where Secteur.Region_id = region.id) count 
from  
    Region 

4 个答案:

答案 0 :(得分:2)

我建议:

SELECT    r.*, COALESCE(s.cnt, 0)
FROM      region r
LEFT JOIN (SELECT   region_id, COUNT(*) AS cnt
           FROM     secteur
           GROUP BY region_id) s ON s.region_id = r.id

请注意,select region.*, count(secteur.region_id) as count from region left join secteur on region.id = secteur.region_id group by region.id, region.field2, region.field3.... 忽略空值,而count(table.field)将包含它们。


或者,在子查询上左联接,并使用count(*)避免为空:

coalesce

答案 1 :(得分:1)

我将在error_reporting(E_ALL); ini_set('display_errors', 1); 的汇总查询中加入region

secteur

答案 2 :(得分:1)

我会使用以下查询:

select r.*,
       (select count(*) 
        from Secteur s
        where s.Region_id = r.id
      ) as num_secteurs 
from Region r;

然后通过在Secteur(region_id)上添加索引来解决性能问题:

create index idx_secteur_region on secteur(region_id);

答案 3 :(得分:0)

您犯了两个错误

  • 第一:您尝试仅在一个(我的意思是第二个)表中计算COUNT()。这是行不通的,因为COUNT()与任何聚合函数一样,仅针对整个行集进行计算,而不仅针对该行的任何部分进行计算(不仅针对一个或一个行其他联接表)。
    在第一个查询中,您可以仅用星号代替 secteur。 *,例如Region.region_id, count(*) AS count,并且不要忘记在GROUP BY步骤中添加Region.region_id。
  • 第二:您不仅在查询中定义了聚合函数,而且还定义了其他字段:select Region.*,但没有在GROUP BY步骤中定义它们。您需要将在GROUP BY步骤中定义的所有列添加到SELECT语句中,但不对它们应用聚合函数。
  • 附加:不可以,GROUP BY Region.*无效,您应该在GROUP BY步骤中按其实际名称定义一列。

所以,正确的形式看起来像

SELECT 
    Region.col1
    ,Region.col2,
    , count(*) count 
from  Region 
left join 
    secteur on secteur.region_id = Region.id
GROUP BY Region.col1, Region.col2

或者,如果您不想键入列的每个名称,请使用窗口查询

SELECT
    Region.*,
    , count( * ) OVER (PARTITION BY region_id) AS count 
from  Region 
left join 
    secteur on secteur.region_id = Region.id