【问题标题】:SQL Inner join table matching rows countSQL 内连接表匹配行数
【发布时间】:2018-02-02 16:58:51
【问题描述】:

我有这样的sql查询

 select fname,lname,Id from Employee e
 inner join Address a on e.Id=a.EmployeeId

我还想在选择列表中包括地址表中与员工表中每一行匹配的行数。

例如。

如果 Employee With FNAme 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 列表,这可能不干净。

【问题讨论】:

  • 您通常按您选择的列进行分组,除了那些作为设置函数的参数的列。在你的情况下:GROUP BY fname,lname,Id.

标签: sql sql-server


【解决方案1】:

使用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,因为如果给定的员工碰巧没有地址,我们会期望计数为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2021-02-23
    • 2017-08-25
    • 2015-10-11
    相关资源
    最近更新 更多