我无法理解如何在不生成大量重复字段的情况下进行多表连接。
假设我有三张桌子:
如果我做一个简单的选择:
select family.id, family.name from family
order by family.id;
我得到一个简单的清单:
ID Name
1 Smith
2 Jones
3 Wong
如果我添加内部联接:
select family.id, family.name, parent.first_name, parent.last_name
from family
inner join parent
on parent.family = family.id
order by family.id;
我得到了一些重复的字段:
ID Name Parent
1 Smith Howard Smith
1 Smith Janet Smith
2 Jones Phil Jones
2 Jones Harriet Jones
3 Wong Billy Wong
3 Wong Rachel Wong
如果我添加另一个内连接:
select family.id, family.name, parent.first_name, parent.last_name
from family
inner join parent
on parent.family = family.id
inner join child
on child.family = family.id
order by family.id;
我得到更多重复的字段:
ID Name Parent Child
1 Smith Howard Smith Peter Smith
1 Smith Howard Smith Sally Smith
1 Smith Howard Smith Fred Smith
1 Smith Janet Smith Peter Smith
1 Smith Janet Smith Sally Smith
1 Smith Janet Smith Fred Smith
2 Jones Phil Jones Mark Jones
2 Jones Phil Jones Melissa Jones
2 Jones Harriet Jones Mark Jones
2 Jones Harriet Jones Melissa Jones
3 Wong Billy Wong Mary Wong
3 Wong Billy Wong Jennifer Wong
3 Wong Rachel Wong Mary Wong
3 Wong Rachel Wong Jennifer Wong
我更喜欢什么,因为它更具人性化,是这样的:
ID Name Parent Child
1 Smith Howard Smith Peter Smith
Janet Smith Sally Smith
Fred Smith
2 Jones Phil Jones Mark Jones
Harriet Jones Melissa Jones
3 Wong Billy Wong Mary Wong
Rachel Wong Jennifer Wong
我知道内部联接的好处之一是避免通过笛卡尔积产品提供过多的信息。但似乎我得到了类似于多表连接的东西。有没有办法总结每个组如上所示,还是需要使用像Python这样的脚本语言进行后处理?
谢谢,
- 丹
答案 0 :(得分:2)
这正是关系数据库的工作方式:每行必须包含您请求的每个字段本身的所有信息。换句话说,每行需要与所有其他行隔离。如果您执行单个查询并且需要获取所有三个级别的信息,则需要自行处理消除重复的格式。
或者,您可以运行三个单独的查询,然后在代码中执行内存中连接。虽然在某些极少数情况下这可能是理想的,但通常是花费开发时间的错误方法,因为RDBMS通常在加入关系数据方面效率更高。
答案 1 :(得分:1)
你已经击中它了。您需要一些后期处理来获得您正在寻找的结果。
答案 2 :(得分:0)
SQL查询结果总是简单的表格数据,因此要获得您正在寻找的结果肯定不是一个漂亮的查询。你可以这样做,但它会涉及相当多的查询voodoo,将事物存储在临时表中或使用游标,或其他一些时髦的解决方法。
我肯定建议使用外部应用程序来检索您的数据,并从那里对其进行适当的格式化。
像.NET中的Entity Framework这样的ORM很可能很容易做到这一点,但你绝对可以用一些嵌套的集合或任何语言的词典来做到这一点。