我们真的不应该对你的问题做任何猜测,但似乎猜测是必要的。
我认为你的三张桌子是:
- Account — id (PK), value, ug (FK 引用 Client), flag
- 客户——ug (PK)
- Justify — value, account_id (PK, 也 FK 引用 Account)
我假设没有客户就没有帐户,没有帐户就没有理由条目(因此 PK 和 FK 约束都由 DBMS 强制执行)。这意味着不必从客户端表中进行选择。
如果您希望客户不一定也列出任何帐户,您可能最好使用单独的查询,但如果有必要可以这样做 - 您必须澄清您的问题,并使用额外级别的外部连接,并担心空值与零值等。
看来所需的输出是:
- 对于每个客户,列出客户标识符
ug
(尚不清楚每个帐户的 Justify 表中是否总是存在值。
但是,我们可以尝试通过逐步构建查询来提供信息。
为特定用户汇总帐户值
SELECT a.ug, SUM(a.value) AS ac_value
FROM Account AS a
WHERE a.flag = 1
GROUP BY a.ug
为特定用户聚合 Justify 的值
SELECT a.ug, SUM(j.value) AS ju_value
FROM Account AS a
JOIN Justify AS j ON j.account_id = a.id
WHERE a.flag = 1
GROUP BY a.ug
前两个结果表的连接
SELECT b.ug, b.ac_value, b.ac_value - NVL(d.ju_value, 0) AS delta
FROM (SELECT a.ug, SUM(a.value) AS ac_value
FROM Account AS a
WHERE a.flag = 1
GROUP BY a.ug
) AS b
LEFT JOIN
(SELECT a.ug, SUM(j.value) AS ju_value
FROM Account AS a
JOIN Justify AS j ON j.account_id = a.id
WHERE a.flag = 1
GROUP BY a.ug
) AS d ON b.ug = d.ug
NVL 的使用允许客户端在 Justify 表中没有条目;LEFT JOIN 也是其中的一部分。