2013-04-01 35 views
3

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

比方说,我有三个表:

  • 家庭:ID,名称
  • 父:身份证,家庭,名字
  • 孩子:身份证,家庭,名字

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

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

感谢,

--Dan

+0

您没有获取重复记录 - 每行返回不同的数据。这与获得笛卡尔产品不同。这可能比您的数据访问层更适合您的表示层。 – sgeddes

回答

2

这正是关系数据库的工作方式:每行必须包含所有信息本身,包含您请求的每个字段。换句话说,每行需要与所有其他行隔离。如果您执行单个查询并且需要获取全部三个级别的信息,则需要处理自己所需的格式设置以消除重复项。

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

0

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

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

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

1

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