gpt4 book ai didi

SQL - 将来自多个表的汇总数据连接在一起

转载 作者:行者123 更新时间:2023-12-04 02:30:59 25 4
gpt4 key购买 nike

这几天我一直遇到以下问题。我已经设法解决了它,但性能是困扰我的地方。

基本上,我有一张人员表和两张表(debtwealth)引用了 persondebt/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) |

我的解决方案:

SQL Fiddle

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(如果这有所不同)。

我希望获得有关如何提高查询性能的提示。我的想法用完了。

最佳答案

好吧,我会这样做,尽管我敢打赌适当的索引对性能的影响比查询结构更大:

编辑帖子评论:

SELECT ID, SUM(debtSum) AS debtSum, SUM(wealthSum) AS wealthSum
FROM (
SELECT p.ID, d.value AS debtSum, NULL AS wealthSum
FROM person AS p
LEFT JOIN debt d ON d.personID = p.ID
UNION ALL
SELECT p.ID, NULL AS debtSum, w.Value AS wealthSum
FROM person AS p
LEFT JOIN wealth w ON w.personID = p.ID
) t
GROUP BY t.ID

您应该在 Person.Id、Debt.PersonID 和 Wealth.PersonID 上建立索引

关于SQL - 将来自多个表的汇总数据连接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30628643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com