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

Sql 查询表1的所有列左联接和表2的计数,sql,sql-server,select,sql-server-2012,count,Sql,Sql Server,Select,Sql Server 2012,Count,我无法使此查询正常工作: 不起作用 select Region.*, count(secteur.*) count from Region left join secteur on secteur.region_id = Region.id 我找到的解决方案是这样的,但是有没有更好的解决方案使用连接,或者如果这不影响性能,因为我有一个大约500K行的非常大的数据集 有效,但害怕性能问题 select Region.*, (select co

我无法使此查询正常工作:

不起作用

select 
    Region.*, count(secteur.*) count 
from  
    Region 
left join 
    secteur on secteur.region_id = Region.id
我找到的解决方案是这样的,但是有没有更好的解决方案使用连接,或者如果这不影响性能,因为我有一个大约500K行的非常大的数据集

有效,但害怕性能问题

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

我将加入
region
secteur
的聚合查询:

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

我将加入
region
secteur
的聚合查询:

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
避免空值:

select region.*, coalesce(t.c, 0) as count
from region left join 
(select region_id, count(*) as c from secteur group by region_id) t on region.id = t.region_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
避免空值:

select region.*, coalesce(t.c, 0) as count
from region left join 
(select region_id, count(*) as c from secteur group by region_id) t on region.id = t.region_id

你犯了两个错误

  • 首先:您必须尝试只在一个(我的意思是第二个)表中计算COUNT()。这不起作用,因为count()与任何聚合函数一样,只计算整组行,而不只是计算集合的任何部分(不只是计算一个或另一个联接表)。
    在第一次查询中,您可以替换secteur。*仅使用星号,如
    Region.Region\u id,将(*)计数为count
    ,并且不要忘记在
    分组依据
    步骤中添加Region.Region\u id
  • 第二:您不仅在查询中定义了聚合函数,而且还定义了其他字段:
    select Region.*
    ,但您没有在
    groupby
    步骤中定义它们。您需要将所有列添加到
    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
或者,如果不想键入每个列的名称,请使用窗口查询


你犯了两个错误

  • 首先:您必须尝试只在一个(我的意思是第二个)表中计算COUNT()。这不起作用,因为count()与任何聚合函数一样,只计算整组行,而不只是计算集合的任何部分(不只是计算一个或另一个联接表)。
    在第一次查询中,您可以替换secteur。*仅使用星号,如
    Region.Region\u id,将(*)计数为count
    ,并且不要忘记在
    分组依据
    步骤中添加Region.Region\u id
  • 第二:您不仅在查询中定义了聚合函数,而且还定义了其他字段:
    select Region.*
    ,但您没有在
    groupby
    步骤中定义它们。您需要将所有列添加到
    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 r.*,
       (select count(*) 
        from Secteur s
        where s.Region_id = r.id
      ) as num_secteurs 
from Region r;
然后通过在
Secteur(region\u id)
上添加索引来解决性能问题:


我同意这个问题:

select r.*,
       (select count(*) 
        from Secteur s
        where s.Region_id = r.id
      ) as num_secteurs 
from Region r;
然后通过在
Secteur(region\u id)
上添加索引来解决性能问题:


为什么不使用
COUNT(Single\u Colunm)
@PrashantPimpale,因为@RuudHelderman是的,它在所有情况下都是相同的吗?原因是有一个查询需要1分13秒才能执行,我使用的是
COUNT(*)
,但一旦我更改为
COUNT(\u id)
,它是int值,现在需要10到15秒才能执行@PrashantPimpale使用冷缓存或热缓存进行测试?指数统计数据是最新的吗?
\u id
是否保留空值?除了持续时间,您还测量了I/O和CPU吗?您是否比较了查询计划?什么版本和版本的SQL Server?我愿意认真对待您的索赔,但是如果没有一个,索赔就没有意义。为什么不使用
COUNT(Single\u Colunm)
@PrashantPimpale,因为@RuudHelderman是的,它在所有情况下都是一样的吗?原因是有一个查询需要1分13秒才能执行,我使用的是
COUNT(*)
,但一旦我更改为
COUNT(\u id)
,它是int值,现在需要10到15秒才能执行@PrashantPimpale使用冷缓存或热缓存进行测试?指数统计数据是最新的吗?
\u id
是否保留空值?除了持续时间,您还测量了I/O和CPU吗?您是否比较了查询计划?什么版本和版本的SQL Server?我愿意认真对待您的声明,但如果没有,声明将毫无意义。返回不正确的语法near*(按行分组)??!!抱歉,您需要列出
区域中包含的字段,每个字段都要按进行分组。在*附近返回不正确的语法(按行分组)??!!很抱歉,您需要列出
区域中包含的字段,每个字段都要按进行分组。就性能而言,我认为这比我的工作查询要好@seddik但这不是使用
左连接
?我在其中添加了一个左连接,这是我认为在性能方面最方便的解决方案,我认为它比我的工作查询更好@seddik但是这不是使用
左连接
?我已经添加了一个左连接,在我看来这是最方便的解决方案