SQL通过第二列获取从一列到自身的连接

SQL通过第二列获取从一列到自身的连接,sql,tsql,Sql,Tsql,SQL,一个表,两列数据,person和mailbox。每个人可能有许多邮箱,每个邮箱可能有许多人。我想获取通过邮箱与其他人连接的人数: person | mailboxCount | aggregatePersonCount 我有一种不好的感觉,这已经在这里的其他地方解决了,但我想不出术语是什么。对于我编写的所有大型、复杂的存储过程和查询,这个简单的两列分析让我感到困惑 表结构: person | mailbox 我有前两栏: SELECT a.person, count(a.mailbo

SQL,一个表,两列数据,
person
mailbox
。每个人可能有许多邮箱,每个邮箱可能有许多人。我想获取通过邮箱与其他人连接的人数:

person | mailboxCount | aggregatePersonCount
我有一种不好的感觉,这已经在这里的其他地方解决了,但我想不出术语是什么。对于我编写的所有大型、复杂的存储过程和查询,这个简单的两列分析让我感到困惑

表结构:

person | mailbox
我有前两栏:

SELECT a.person, count(a.mailbox) mailboxCount
FROM [EmailGroupAnalysis].[dbo].[AnalysisTests] a
GROUP BY a.person
order by mailboxCount desc

您可以使用自联接:

select a.person, count(distinct a.mailbox) as mailboxCount,
       count(distinct a2.person) as mailboxConnectedPersons
from [EmailGroupAnalysis].[dbo].[AnalysisTests] a left join
     [EmailGroupAnalysis].[dbo].[AnalysisTests] a2 
     on a.mailbox = a2.mailbox 
group by a.person
order by mailboxCount desc;
注意:这将计算原始人。您可以减去1以避免出现这种情况。

就您的数据而言,“通过邮箱与其他人连接的人”是如何定义的?使用公共表表达式(CTE)的递归解决方案可能是合适的。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,
tsql
缩小了选择范围,但没有指定数据库。