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但是这不是使用左连接
?我已经添加了一个左连接,在我看来这是最方便的解决方案