我有一张桌子(tblGoals),显示每位球员得分的目标数,例如:
| Player | Goals |
--------------------
| John | 6 |
| Chris | 10 |
| Ben | 4 |
我正在尝试编写一个查询,输出每个玩家以及他们已经得分的球队总进球的百分比:
| Player | PercentageGoals |
------------------------------
| John | 0.3 |
| Chris | 0.5 |
| Ben | 0.2 |
我已经找到了如何使用子查询执行此操作
SELECT
Player,
Goals/ (SELECT SUM(Goals)FROM tblGoals) AS PercentageGoals
FROM tblGoals
我展示的示例表只是为了演示我想要做的事情。我使用的实际表是一个更大的数据集,并尝试使用子查询以这种方式获得百分比运行速度非常慢。
我之前在Access中注意到,自联接通常比子查询更有效地进行优化,因此我试图弄清楚是否可以使用自联接重写上述查询。
我尝试了下面的内容,但显然这是不正确的,因为t2按玩家分组,这意味着我没有获得真正的总数,但如果我将玩家名称留下,那么我就无法加入它?
SELECT
t1.Player,
t1.Goals/t2.sumGoals AS PercentageGoals
FROM
tbl1 t1
INNER JOIN
(SELECT Player, SUM(Goals) as sumGoals
FROM tbl1
GROUP BY Player) t2
ON t1.Player= t2.Player
有没有办法做到这一点?
答案 0 :(得分:3)
我会尝试这个作为答案 - 虽然我不确定它是否会更快,因为只使用三个记录。
您在联接中的第二个表应该只有第一个表中的每个记录加入的所有目标 - 笛卡尔积。
然后你可以将另一个分开:
SELECT Player
, Goals / TotalGoals AS Total
FROM tblGoals, (SELECT SUM(Goals) AS TotalGoals FROM tblGoals)
在大桌子上是否更快?我的想法是在你的SQL中计算每条记录的总数,而这会将总数创建为一个表并加入它,所以只应计算一次。