【问题标题】:Joining 2 PostgreSQL Tables连接 2 个 PostgreSQL 表
【发布时间】:2019-11-02 16:49:15
【问题描述】:

好的,这听起来像是一个非常基本的问题,但显然有一个基本的解决方案。我不是 SQL 的优秀用户,但我在连接两个表时遇到了问题。最好我向您展示我正在尝试加入的内容:

表 1,学生信息

+--------------------------------------------+
| NAME        ID         DEPARTMENT        N |
+--------------------------------------------+
| Joe Blogs   234-2      Maths             2 |
| Jane Doe    342-6      Physics           4 |
| John Smith  356-1      Chemistry         7 |
+--------------------------------------------+

表 2,students_grades

+--------------------------------+
| SUBJECT         GRADE     N   |
+--------------------------------+
| Chemistry       B         NULL |
| Physics         A         NULL |
| Maths           A         NULL |
| Engineering     B         NULL |
| NULL            NULL      2    |
+--------------------------------+

两个表都包含一个名为 N 的列。students_info 表已经自带了,但是我在 students_grades 表中添加了一个列 N,希望我可以加入通过此列的 2 个表。

现在,我对 students_info 中的 Joe 博客 感兴趣,因此我将 2 放在表 students_grades 的 N 列中。因此,我希望获取有关 Joe 博客 和输出的所有信息。然后输出表将显示他的姓名、ID、部门和科目以及成绩。

有人知道我该怎么做吗?前几天有人建议使用外键..?

注意:基本上,students_info 中的每个学生(或行)都有自己的表 students_grades

我正在寻找的是(在我的脑海中)看起来像的东西:

+----------------------------------------------------------------+
| NAME        ID       DEPARTMENT       SUBJECT        GRADE     |
+----------------------------------------------------------------+
| Joe Blogs   234-2    Maths            Chemistry      B         |
|                                       Physics        A         |
|                                       Maths          A         |
|                                       Engineering    B         |
+----------------------------------------------------------------+

干杯

【问题讨论】:

  • 来自 students_info 的 ID 需要作为外键在 student_grades 中。
  • students_grades 表中的 N=2 在所有其他列中都为 NULL。那么您对 ​​Joe Blogs 的主题和年级专栏有何期望?
  • 从本质上讲,students_info 中的每个学生(或行)都有自己的表,students_grades你应该重新考虑这个设计。
  • 或者,用与每条记录相关的学生对应的数字填充第二个表中的 N。
  • 请参阅How to Ask,点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。这表明没有努力通知自己。你能做哪些部分?您的教科书或文档对任何相关内容有什么看法? PS 请在代码问题中提供minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。 PS 一个“基本上”或“基本上”或“换句话说”,它没有介绍或总结您也给出的清晰、准确和完整的描述,只是意味着“不清楚”。

标签: sql postgresql join


【解决方案1】:

要将成绩表中的信息与您的学生 Joe 相关联,该表应如下所示:

+-------------------------------+
| SUBJECT         GRADE     N   |
+-------------------------------+
| Chemistry       B         2   |
| Physics         A         2   |
| Maths           A         2   |
| Engineering     B         2   |
+-------------------------------+

您可以为其他学生添加更多行,例如为 Jane 分配化学 A 和 John 数学 C:

| Chemistry       A         4   |
| Maths           C         7   |

要加入这些,你会使用

SELECT * FROM students_info JOIN students_grades USING (N)

N 列应在students_info 表中声明为唯一,students_grades.N 列应为引用前者的外键。或者,使其引用ID 列,并且不要在students_info 中引入额外的人工键。

【讨论】:

    【解决方案2】:

    如果我猜对了,您正在寻找如下脚本。但是根据您的示例数据,您基本上会在 Joe Blogs 的 Subject 和 Grade 字段中得到 NULL,因为表 students_grades 的 N 列中的行包含 2 基本上在其他列中没有数据。

    SELECT
    A.NAME,
    A.ID,
    A.DEPARTMENT,
    B.SUBJECT,
    B.GRADE
    FROM students_info A
    INNER JOIN students_grads B
    ON A.N = B.N
    

    【讨论】:

    • 你给的样本数据是真的吗?
    • 我不是 OP。
    • @mkRabbani。那么本质上是真实的。我基本上是在努力学习
    • 从你的数据和解释表之间的关系来看,我只能在 Subject 和 Grade 列中为你选择 NULL :)
    猜你喜欢
    • 2014-11-18
    • 2016-09-03
    • 2011-09-11
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2017-05-31
    相关资源
    最近更新 更多