我有像这样的SQL查询
select fname,lname,Id from Employee e
inner join Address a on e.Id=a.EmployeeId
我还希望包含在选择列表中的是,地址表中与employee表中的每一行匹配的行数。
例如。
如果员工使用FNAme mandar有两个地址行,那么在选择中我应该看到
Mandar 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 in the
groupby
列表,这可能不干净。
答案 0 :(得分:3)
使用COUNT
作为分析函数:
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
的调用将返回每个员工分区的地址记录数。
编辑:我们应该计算a.EmployeeId
,因为如果给定的员工碰巧没有地址,我们会期望零计数。