5

我无法理解如何在不生成大量重复字段的情况下进行多表连接。

假设我有三个表:

  • 家庭:身份证、姓名
  • 父母:身份证,家庭,姓名
  • 孩子:身份证、家庭、姓名

如果我做一个简单的选择:

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 等脚本语言进行后处理?

谢谢,

- 担

4

3 回答 3

2

这正是关系数据库的工作方式:每一行本身必须包含所有信息,以及您请求的每个字段。换句话说,每一行都需要独立于所有其他行才有意义。如果您执行单个查询并且需要获取所有三个级别的信息,则需要自己处理消除重复项以获得所需的格式。

或者,您可以运行三个单独的查询,然后在代码中进行内存连接。尽管在某些极少数情况下这可能是可取的,但这通常是花费开发时间的错误方式,因为 RDBMS 通常在连接关系数据方面效率更高。

于 2013-04-01T00:21:01.993 回答
1

你已经击中它的头了。您需要进行一些后期处理才能获得所需的结果。

于 2013-04-01T00:20:40.883 回答
0

SQL 查询结果始终是简单的表格数据,因此要获得您正在寻找的结果绝对不是一个漂亮的查询。你可以这样做,但它会涉及到相当多的查询巫术,将东西存储在临时表中或使用游标,或其他一些时髦的解决方法。

我肯定会建议使用外部应用程序来检索您的数据并从那里适当地格式化它。

像 .NET 中的实体框架这样的 ORM 可能很容易做到这一点,但您绝对可以使用任何语言的一些嵌套集合或字典来做到这一点。

于 2013-04-01T00:20:36.447 回答