首页 > 解决方案 > 对两个以上的表使用 sql join 的正确方法是什么?

问题描述

我有一个棘手的(至少对我而言)挑战,涉及对 3 个不同表的查询以找到:

所有学生的 Study_ID、Study_Name、Price、Sdate 成绩.freshman (grade=freshman)

我开始尝试将它拼凑起来,但我很快就迷失在复杂性中。我觉得你需要加入,但我无法解开。

这是我迷路之前的情况。

SELECT Study_ID, Study_Name, Price, Sdate
     FROM Receives
          INNER JOIN Study ON Study_ID, Study_Name
          INNER JOIN Student ON Grade='freshmen';

不幸的是,就是这样。这是表格。

CREATE TABLE Student(
     S_ID char(6), 
     Name varchar(20), 
     Grade varchar(20), 
     Age integer, 
     PRIMARY KEY(S_ID)
);

CREATE TABLE Study(
     Study_ID varchar(6), 
     Study_Name varchar(20), 
     Label varchar(15), 
     PRIMARY KEY (Study_ID)
);

CREATE TABLE Receives(
     S_ID char(6), 
     Study_ID char(6), 
     Sdate date, 
     Price decimal(5,2), 
     PRIMARY KEY(S_ID, Study_ID), 
     FOREIGN KEY(Study_ID)  
     REFERENCES Study(Study_ID)
);

标签: sqldatabase

解决方案


这里有两种方法:考虑表如何相互关联,并考虑表中的列/外键。

Student 和 Study 表没有直接关系,但 Receives 表是两者之间的关系(有时也称为associative、junction、link 或复合表等),因此您可以通过 Receives 加入 Student 和 Study。

从列/外键方法来看,ReceivesReceives表具有引用 Student 和 Study 表的列,因此它可用于连接这些表(Student(S_ID)有关的)。

在 SQL 中,它看起来像:

SELECT ...
  FROM Receives
    INNER JOIN Study ON ...
    INNER JOIN Student ON ...

JOIN 子句中表的顺序是风格问题;在这里,我先给出加入表。更典型的是,我在它们加入时列出它们(读起来更像自然语言)。例如,Student ⋈ Receives ⋈ Study(“A student Receives study”)或(在 SQL 中):

Student
  JOIN Receives ON ...
  JOIN Study ON ...

推荐阅读