SQL内部联接表匹配行数
我有这样的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
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。