sql - 对两个以上的表使用 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)
);
解决方案
这里有两种方法:考虑表如何相互关联,并考虑表中的列/外键。
Student 和 Study 表没有直接关系,但 Receives 表是两者之间的关系(有时也称为associative、junction、link 或复合表等),因此您可以通过 Receives 加入 Student 和 Study。
从列/外键方法来看,Receives
Receives表具有引用 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 ...
推荐阅读
- maven - 如何配置 maven 以使用基于项目所在文件夹或依赖坐标中的存储库?
- null - 使用 Python 将 NULL 插入 SQL Server 列
- python - 从另一个数据框列中的另一个单词列表中删除数据框列中每一行中的单词
- angular - Angular - 子组件不呈现来自 http 请求的数据更新
- json - JMeter PreProcessor - JSON EXtractor:嵌套对象
- java - 从图库中选择的图像 ImageView 消失了
- airflow - 如何在气流发送的电子邮件中嵌入谷歌文档链接
- jsonnet - jsonnet条件生成一个字段
- reactjs - 使用 Formik 反应材质 UI 颜色选择器
- sql - 触发 SQL 语句