sql - 具有内连接的重复字段

标签 sql

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

假设我有三个表:

  • 家庭:身份证、姓名
  • parent :身份证、家庭、姓名
  • child :身份证、家庭、姓名

  • 如果我做一个简单的选择:
    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 这样的脚本语言进行后处理?

    谢谢,

    - 担

    最佳答案

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

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

    关于sql - 具有内连接的重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736081/

    相关文章:

    mysql - 基于 ORDER 字段而不是首次出现的累积字段

    SQL:如果记录列表存在,返回 "true"?

    javascript - 防止 HTML 形式的 JS/CSS

    mysql - 从第二个表(Mysql)中选择相应的值

    mysql - 为规范化 3NF 分解表格

    php - 从多个数组插入相同的查询

    mysql - 将所有 INT 值更改为 JSON 的 SQL 补丁

    mysql - 选择月份、年份和数量并显示零条目的月份

    sql - 每条记录的倒数第二个日期

    mysql - 为什么 TINYINT(1) 作为 bool 值运行而 INT(1) 不运行?