我会试着举一个例子 - 这不是我的表格结构 - 我只是想概述这个问题以找到解决方案......
人员 ID、姓名
BrothersNames Id, 名称
SistersNames Id, 名字
PersonBrothers(连接表)PersonId、BrotherNameId
PersonSisters(连接表)PersonId、SisterNameId
好的 - 想象一下这个数据库包含来自一个小国家的每个人。数据库记录了每个人的兄弟姐妹的名字(它不会将一个人映射到他们的兄弟姐妹——只是他们的名字),以便我们可以找到关于名字的统计数据。
显然很多名字是共享的,所以连接表为我们规范了这一点。
我想要做的是取一个用户,找出系统中每个其他用户的兄弟姓名匹配数和姐妹姓名匹配数,然后将这两个匹配项加在一起并按降序排列。所以这会给我们一个拥有最多兄弟姐妹名字的用户列表。
我真的只对前十场比赛感兴趣,但我认为我必须得到整个结果集才能计算出前十场比赛。
请注意,在我的实际数据中,一个人可以有一百万个兄弟或一百万个姐妹。这是我遇到性能问题的地方。
这就是我计算兄弟匹配的方式,我为姐妹计算匹配
select p.id, matches
FROM Person p
LEFT JOIN
(
SELECT
COUNT(*) AS Matches,
pbn.PersonId
FROM PersonBrothersNames pbn
INNER JOIN Brothersnames bn on pbn.BrothernameId =bn.Id
inner join PersonBrothersName otherpbn on otherpbn.BrothernameId = bn.Id
WHERE pbn.PersonId= @PersonId and pbn.PersonId <> otherpbn.personid
GROUP BY pbn.PersonId
) As BrothersNamesJoin ON BrothersNamesJoin.Person = p.Id
Run Code Online (Sandbox Code Playgroud)
请让我知道我是否应该指定更多信息...我使用的是 SQL Server 2008,但可能与平台无关...
sql-server ×1