SQL内部联接表匹配行数

SQL内部联接表匹配行数,sql,sql-server,Sql,Sql Server,我有这样的sql查询 select fname,lname,Id from Employee e inner join Address a on e.Id=a.EmployeeId 我还想在选择列表中包括地址表中与employee表中的每一行匹配的行数 比如说 如果具有FNAme mandar的员工有两个地址行,那么在select中我应该看到 曼达J 1 2 我知道我可以用groupby来实现这一点,但我在想,如果只获取匹配行的数量,这是否是实现这一点的理想方法。子查询可能不利于性能 se

我有这样的sql查询

 select fname,lname,Id from Employee e
 inner join Address a on e.Id=a.EmployeeId
我还想在选择列表中包括地址表中与employee表中的每一行匹配的行数

比如说

如果具有FNAme mandar的员工有两个地址行,那么在select中我应该看到

曼达J 1 2

我知道我可以用groupby来实现这一点,但我在想,如果只获取匹配行的数量,这是否是实现这一点的理想方法。子查询可能不利于性能

select fname,lname,Id,count(a.Id) from Employee e
inner join Address a on e.Id=a.EmployeeId
groupby a.EmployeeId 
然后我还必须将fname,lname,Id包含在 groupby列表,可能不干净。

使用计数作为分析函数:

SELECT
    e.fname,
    e.lname,
    e.Id,
    COUNT(a.EmployeeId) OVER (PARTITION BY e.Id) AS cnt
FROM Employee e
INNER JOIN Address a
    ON e.Id = a.EmployeeId
上面对COUNT的调用将返回每个雇员分区的地址记录数

编辑:我们可能应该计算一个.EmployeeId,因为如果给定的员工碰巧没有地址,我们希望计数为零。

使用计数作为分析函数:

SELECT
    e.fname,
    e.lname,
    e.Id,
    COUNT(a.EmployeeId) OVER (PARTITION BY e.Id) AS cnt
FROM Employee e
INNER JOIN Address a
    ON e.Id = a.EmployeeId
上面对COUNT的调用将返回每个雇员分区的地址记录数


编辑:我们可能应该计算一个.EmployeeId,因为如果给定的员工碰巧没有地址,我们会期望计数为零。

您通常按照所选的列进行分组,但设置函数的参数除外。在您的例子中,do:groupbyfname、lname、Id。您通常按照所选的列进行分组,但作为设置函数参数的列除外。在您的例子中,do:GROUP BY fname、lname、Id。