几天来我一直遇到以下问题。我已经设法解决了它,但是性能让我感到困扰。
基本上我有一张人员表和两张表(debt
和wealth
),其中引用了person
. debt
/wealth
表可以有多个引用相同的行personID
。
我需要一个结果,我将简单地将所有列出的人以及总债务和财富作为自己的列。
首先让我代表我拥有的表格:
表“人”:
| ID | name |
|----|---------|
| 1 | Adam |
| 2 | Berg |
| 3 | Carl |
| 4 | David |
表“财富”:
| ID | personID | value |
|----|----------|----------|
| 1 | 1 | 100 |
| 2 | 1 | 2000 |
| 3 | 2 | 30000 |
| 4 | 3 | 400000 |
| 5 | 3 | 5000000 |
表“债务”:
| ID | personID | value |
|----|----------|----------|
| 1 | 1 | 100 |
| 2 | 1 | 2000 |
| 3 | 2 | 30000 |
| 4 | 2 | 400000 |
| 5 | 3 | 5000000 |
预期结果:
| personID | debtSum | wealthSum |
|----------|---------|-----------|
| 1 | 2100 | 2100 |
| 2 | 30000 | 430000 |
| 3 | 5400000 | 5000000 |
| 4 | (null) | (null) |
我的解决方案:
SELECT SQL_NO_CACHE p.ID, debtSum, wealthSum
FROM person AS p
LEFT JOIN (SELECT personID, SUM(value) AS debtSum FROM debt GROUP BY personID) AS d ON d.personID = p.ID
LEFT JOIN (SELECT personID, SUM(value) AS wealthSum FROM wealth GROUP BY personID) AS w ON w.personID = p.ID
此查询返回正确的数据,但正如我所说,性能让我担心。例如,如果我在一个不存在的人的债务表中添加了数千行(例如,personID = 5),则执行查询需要更长的时间。我想它确实也总结了那个人的所有数据,尽管结果不需要它?
我使用的是 SQL Server 2008,尽管SQL Fiddle它使用的是 MySQL(如果有区别的话)。
我很感激有关如何提高查询性能的提示。我的想法不多了。