Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Sql select语句中获取Count as字段的最佳方法_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

在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

在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
    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部分中概述的子查询。为它创建一个视图可能会有所帮助。