【问题标题】:How to combine tables in access 2010access 2010中如何合并表格
【发布时间】:2018-07-29 22:28:45
【问题描述】:

我是一个有访问权限的新手,我需要一些帮助。

我正在尝试在 access 中合并 2 个表。

Table 1:
ID      First_Name   Last_Name     Gender
12345   John         Doe           F
22345   Jane         Clin          M

Table 2:
ID       First_Name   Last_Name     Grade
12345    Curt         Doe            2
12345    Carry        Doe            3
12345    Sid          Doe            1
22345    Mel          Clin           7

如何在Access中编写SQL来显示

ID      First_Name   Last_Name     Gender   Grade
12345   John         Doe           F
12345   Curt         Doe           M         2
12345   Carry        Doe                     3
12345   Sid          Doe                     1
22345   Jane         Clin          M
22345   Mel          Clin                    7

感谢您的帮助。

【问题讨论】:

  • 欢迎您。请提供有关您尝试过的操作和发生的情况的更多信息。使用tour 可能是个好主意。
  • 使用您的样本数据,为什么 Curt Doe 会列出性别?为什么他们都有相同的ID?表 1 和表 2 有什么关系?基于名字和姓氏? (不是一个好的设计)看来您需要生成一组主名称,因此首先根据 ID、first_name、Last_name 合并两个表。然后取那个派生表并加入 table2 以获得成绩。和表1获取性别;但这并不能解释生硬的性别定义。
  • 这是父/子的两张表吗?即 John Doe 是 Curt、Carry 和 Sid 的父母吗?

标签: ms-access join union


【解决方案1】:

鉴于您提供的联合和两个左连接应该可以解决问题。虽然这是一个糟糕的数据库设计,或者示例数据很糟糕。

这就是为什么

  1. 所有用户的 ID 都相同
  2. 似乎必须加入名字和姓氏,我们都知道拼写错误和名称更改变得难以管理,因此数据输入错误导致我们得到不正确的结果。
  3. Curt 在您的样本结果中有性别,但样本数据中不存在性别。这个值是从哪里来的?
  4. 我假设 ID 应该与记录相关;但是我们必须加入 ID、名字和姓氏才能获得唯一的记录。在没有这些知识的情况下,这些表格上的 PK 是什么,我们的答案纯属猜测。
  5. 如果我们假设 Table1 的 PK 是 ID,而 Table2 ID 是 table1 的外键,那么我们应该能够加入 ID;但样本数据并未反映这一点。那么每张桌子上的 PK 和 FK 是什么?

.

给定样本数据和期望的结果;我的方法是将两个表中的所有 ID 和名称合并到一组数据中,然后将此数据外部连接回 table1 和 table2 以获得性别和成绩。理想情况下,我们只是加入 ID;但示例数据似乎并未表明 ID 是任一表的主键/外键。

SELECT Der.ID, Der.First_name, Der.Last_name, T1.Gender, T2.Grade
FROM (SELECT ID, First_Name, Last_name
      FROM table1
      UNION 
      SELECT ID, First_Name, Last_name
      FROM Table2) DER
LEFT JOIN Table1 T1
 on T1.Id = Der.ID
and T1.First_name = Der.First_name
and T1.Last_name = Der.Last_name
LEFT JOIN table2 T2
 on T2.Id = Der.ID
and T2.First_name = Der.First_name
and T2.Last_name = Der.Last_name

为什么?

因为这两个表都没有包含您想要在结果中显示的完整名称列表,但将它们组合在一起;因此需要派生一个包含所有名称和 ID 的表。然后,外连接允许我们获取联合集的性别和成绩。

但在进一步发展之前;我真的会查看表格设计并了解 PK/FK 关系并确保您的数据是准确的。似乎表 1 是“人员”表,而表 2 更像是每个班级/年级/年表的成绩。这将是一个 1:M 的关系;因此,persons 表的 ID 应该是“grades”表的 FK,它应该在 PK 或班级年人的复合键上。然后你就不必在成绩表中列出姓名了。除非你担心跟踪每个年级/年/学期的姓名变化...

【讨论】:

    【解决方案2】:
    SELECT A.ID, A.First_Name, A.Last_Name, A.Gender, B.Grade
    FROM TABLE_1 A 
    INNER JOIN TABLE_2 B 
      on A.ID=B.ID;
    

    这些表格是您制作的,还是您被困在其中?如果我们假设 ID 是其中的常见项目,那么您不想将 First_Name 和 Last_Name 放在两个表中。只需在两个表中包含 ID 即可建立链接。 如果您想包含 TABLE_2 中的所有内容,无论它们是否存在于 TABLE_2 中,请将 INNER JOIN 更改为 LEFT OUTER JOIN。

    编辑 我发现我假设 TABLE_1 是一个主要的错误。我认为在这种特殊情况下你真正想要的是一个联合。

    SELECT U.ID, U.First_Name, U.Last_Name, U.Gender, U.Grade 
    FROM (SELECT ID, First_Name, Last_Name, Gender, '' AS Grade 
          FROM TABLE_1
          UNION
          SELECT ID, First_Name, Last_Name, '' AS Gender, Grade 
          FROM TABLE_2) U
    

    HTH, 迈克

    【讨论】:

    • 如果两个表之间的名称/ID 有重叠,那么您会在结果中得到重复的记录。我们仍然需要了解 curt 如何在给定样本数据的情况下获得性别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多