CREATE TABLE [arsenal] (
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[agent] INTEGER NOT NULL,
[haul] DECIMAL NOT NULL,
[target] INTEGER NOT NULL);
INSERT INTO arsenal (agent, haul, target) VALUES (1, 10, 2), (1, 100, 2), (2, 20, 1), (2, 200, 1);
我有一张看起来像这样的桌子。我想haul
为每个用户获取所有 s 的总和,但用户分布在两列agent
和target
. 例如,用户 id = 1 的代理的总和为 110,而目标字段中的同一用户的总和为 220。因此有效总和为 110 + 220 = 330。类似地,用户 id = 2 的有效总和为 330 (代理列中为 220,目标列中为 110)。
如果我的来源是:
id agent haul target
1 1 10 2
2 1 100 2
3 2 20 1
4 2 200 1
,我需要输出:
user haul
1 330
2 330
. 我可以通过以下方式实现:
SELECT user, SUM(sum)
FROM (
SELECT agent AS user, SUM(haul) AS sum
FROM arsenal
GROUP BY agent
UNION ALL
SELECT target, SUM(haul)
FROM arsenal
GROUP BY target
) AS t
GROUP BY user;
我试图摆脱联合,因为围绕联合所有的实际选择查询有点复杂,所以我假设这是一个瓶颈。有没有更好的方法来实现这一点,可能没有子查询?
这是一个非常相似的线程,但答案对我没有吸引力。谢谢
编辑:这是实际的查询:
SELECT user, SUM(sum)
FROM (
SELECT agent AS user, SUM(haul) AS sum
FROM arsenal AS a
JOIN bucket AS b ON b.parent_id=a.id
JOIN region AS r ON r.terminal = b.terminal
WHERE a.status=@status AND r.savedStatus=@savedStatus
GROUP BY agent
UNION ALL
SELECT target, SUM(haul)
FROM arsenal
JOIN bucket AS b ON b.parent_id=a.id
JOIN region AS r ON r.terminal = b.terminal
WHERE a.status=@status AND r.savedStatus=@savedStatus
GROUP BY target
) AS t
GROUP BY user;
此外,它在 s 中有更多字段SELECT
。SELECT
这里要注意的是,在两个s in中都运行了两次完全相同的查询UNION
。所以我试图UNION
完全避免并依靠某种JOIN
左右来避免冗余。