Sql (大型)嵌套循环(内部联接)的替代方案

Sql (大型)嵌套循环(内部联接)的替代方案,sql,sql-server,performance,database-performance,Sql,Sql Server,Performance,Database Performance,请查看此SELECT语句: SELECT b.player_id, COUNT(CASE WHEN a.team = m.team_win THEN 1 END), COUNT(CASE WHEN a.team <> m.team_win THEN 1 END) FROM players a, players b, JOIN matches m ON m.match_id = b.match_id WHERE a.pla

请查看此SELECT语句:

SELECT
    b.player_id,
    COUNT(CASE WHEN a.team = m.team_win THEN 1 END),
    COUNT(CASE WHEN a.team <> m.team_win THEN 1 END)
FROM
    players a,
    players b,
JOIN
    matches m
    ON m.match_id = b.match_id
WHERE
    a.player_id <> b.player_id
    and a.team <> b.team
    and a.player_id = 100
GROUP BY
    b.player_id
球员表


您缺少对players表的联接,因此得到的是笛卡尔积。请尝试以下方法:

SELECT
    b.player_id,
    COUNT(CASE WHEN a.team = m.team_win THEN 0 END),
    COUNT(CASE WHEN a.team <> m.team_win THEN 1 END)
FROM
    matches m
JOIN players a ON m.match_id = a.match_id
JOIN players b ON m.match_id = b.match_id
WHERE
    a.player_id <> b.player_id
    and a.team <> b.team
    and a.player_id = 100
GROUP BY
    b.player_id

您缺少对players表的联接,因此得到的是笛卡尔积。请尝试以下方法:

SELECT
    b.player_id,
    COUNT(CASE WHEN a.team = m.team_win THEN 0 END),
    COUNT(CASE WHEN a.team <> m.team_win THEN 1 END)
FROM
    matches m
JOIN players a ON m.match_id = a.match_id
JOIN players b ON m.match_id = b.match_id
WHERE
    a.player_id <> b.player_id
    and a.team <> b.team
    and a.player_id = 100
GROUP BY
    b.player_id

你似乎想知道:对于每名球员,当该球员与100名球员比赛时,该球员的球队赢了多少次,输了多少次。让我们先来看看团队总结:

SELECT p.team,
       SUM(CASE WHEN p.team = m.team_win THEN 1 ELSE 0 END) as teamwins,
       SUM(CASE WHEN p.team <> m.team_win THEN 1 ELSE 0 END) as teamlosts
FROM players p JOIN
     matches m
     ON m.match_id = p.match_id
GROUP BY p.team
HAVING sum(case when p.player_id = 100 then 1 else 0 end) -- be sure player 100 played
接下来,您可以加入到玩家中,以获取团队信息


我现在停在这里是因为我需要确保球队在一段时间内保持稳定

你似乎想知道:对于每名球员,当该球员与100名球员比赛时,该球员的球队赢了多少次,输了多少次。让我们先来看看团队总结:

SELECT p.team,
       SUM(CASE WHEN p.team = m.team_win THEN 1 ELSE 0 END) as teamwins,
       SUM(CASE WHEN p.team <> m.team_win THEN 1 ELSE 0 END) as teamlosts
FROM players p JOIN
     matches m
     ON m.match_id = p.match_id
GROUP BY p.team
HAVING sum(case when p.player_id = 100 then 1 else 0 end) -- be sure player 100 played
接下来,您可以加入到玩家中,以获取团队信息


我现在停在这里是因为我需要确保球队在一段时间内保持稳定

您的查询没有执行您认为它正在执行的操作。请提供球员和比赛表的布局。例如,为什么一个名为players的表中会有一个matchid?你有一个笛卡尔乘积…在players b上加入players a,其中a.playerID b.playerID创建了1700万-1*1700万-1行…这不是故意的,不是吗?@GordonLinoff:添加了这些表。把球员想象成,更像是参加某场比赛的球员。在比赛中,每一场比赛大约有10场,或给或拿。@12th:这是我唯一能想到的得到我想要的结果集的方法。如果有更好的方法,我肯定一定有,那么我需要学习。对不起,请阅读上面的评论给戈登。所以这应该是每个玩家的赢/输计数?你的查询没有做你认为它正在做的事情。请提供球员和比赛表的布局。例如,为什么一个名为players的表中会有一个matchid?你有一个笛卡尔乘积…在players b上加入players a,其中a.playerID b.playerID创建了1700万-1*1700万-1行…这不是故意的,不是吗?@GordonLinoff:添加了这些表。把球员想象成,更像是参加某场比赛的球员。在比赛中,每一场比赛大约有10场,或给或拿。@12th:这是我唯一能想到的得到我想要的结果集的方法。如果有更好的方法,我肯定一定有,那么我需要学习。对不起,请阅读上面的评论给戈登。所以这应该是每个玩家的赢/输计数?+1看起来是正确的……他需要从比赛表开始,而不是从玩家开始。你将万亿行嵌套循环转化为一个秒查询的一小部分。非常感谢。但愿我能投两次赞成票。@JHallam-很高兴能帮上忙+1看起来是正确的…他需要从matches表开始,而不是从player开始。您将一个万亿行嵌套循环转化为一次查询的一小部分。非常感谢。但愿我能投两次赞成票。@JHallam-很高兴能帮上忙!