在Sql select语句中获取Count as字段的最佳方法
在Sql select语句中获取Count as字段的最佳方法 我有两张桌子:人和订单 人在Sql select语句中获取Count as字段的最佳方法,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,在Sql select语句中获取Count as字段的最佳方法 我有两张桌子:人和订单 人 命令 我希望用户了解订单总数的详细信息,因此为此,我有两种解决方案: 1. select p.Name,p.Age,(select count(1) form orders o where o.personId= p.Id as cntVal from Person p 2. select p.Name,p.Age,cntVal from Person p
命令
我希望用户了解订单总数的详细信息,因此为此,我有两种解决方案:
1. select p.Name,p.Age,(select count(1) form orders o where o.personId= p.Id as cntVal
from Person p
2. select p.Name,p.Age,cntVal
from Person p
inner join (select personId,count(1) as cntVal from orders o group by PersonId) cnt
on cnt.personId=p.Id
我们有大约20万条个人记录和15万条订单记录。
我想知道哪种方法更好?
或者你可以建议我一个更快的查询我是否遗漏了什么
select p.name, p.age, count(o.OrderId)
from Person p join Orders o on p.PersonId = o.PersonId
group by p.name, p.age
我错过什么了吗
select p.name, p.age, count(o.OrderId)
from Person p join Orders o on p.PersonId = o.PersonId
group by p.name, p.age
这是另一种选择——这将是我的第一选择
select p.Name,p.Age, count(orderID)
from
Person p
inner join
Orders o
on p.Id = o.personId
group by p.id, p.Name, p.Age
如果你想让没有下订单的人也计算在内,将内部连接更改为左连接这是另一种选择-这将是我的第一选择
select p.Name,p.Age, count(orderID)
from
Person p
inner join
Orders o
on p.Id = o.personId
group by p.id, p.Name, p.Age
如果您想让没有下订单的人也计算在内,请将内部联接更改为左联接如果您唯一关心的是效率和速度,我建议您使用SQL Profiler,看看哪个选项可以以最少的读取和资源消耗生成最快的结果 您还有另一个选择:
Select
p.Name,
p.Age,
Count(*) as OrderCount
From Person p
Join Orders o on p.PersonId = o.PersonId
Group By p.Name, p.Age
测试所有这些,看看哪个是最好的。如果您唯一关心的是效率和速度,我建议您使用SQL Profiler,看看哪个选项可以以最少的读取量和资源消耗生成最快的结果 您还有另一个选择:
Select
p.Name,
p.Age,
Count(*) as OrderCount
From Person p
Join Orders o on p.PersonId = o.PersonId
Group By p.Name, p.Age
测试所有这些,看看哪一个是最好的。应该在速度上没有差异(特别是如果您将第二个内部查询修复为GroupByPersonID)。另外,您可以使用count(*)来提高可读性reasons@VeeBee:完全是胡说八道:@VeeBee这不是真的。yashpal-2比1效率更高,但通过在外部使用GROUPBY(参见下面paul的回答),可以进一步改进2,速度应该没有差异(特别是如果您将第二个内部查询修复为GROUPBY personId)。另外,您可以使用count(*)来提高可读性reasons@VeeBee:完全是胡说八道:@VeeBee这不是真的。yashpal-2比1效率更高,但通过在外部使用Group by(参见下面paul的回答),您可以进一步改进2。我唯一关心的是,OP是否也希望在
person
中检索更多的列。但是,是的,从所问的问题来看,这似乎是一种方式,其他大多数事情都太复杂了。我的实际问题更复杂,我有几个其他表涉及到查询,所以我们不能使用分组。例如,用户支付的总金额、信用卡支付计数、借记卡支付计数等。我有大约15个表在join中,所以它对我来说不起作用。在这种情况下,我想您应该使用第2部分中概述的子查询。为它创建一个视图可能会有帮助。我唯一关心的是,OP是否也希望在person
中检索更多的列。但是,是的,从所问的问题来看,这似乎是一种方式,其他大多数事情都太复杂了。我的实际问题更复杂,我有几个其他表涉及到查询,所以我们不能使用分组。例如,用户支付的总金额、信用卡支付计数、借记卡支付计数等。我有大约15个表在join中,所以它对我来说不起作用。在这种情况下,我想您应该使用第2部分中概述的子查询。为它创建一个视图可能会有所帮助。