如何从具有多个外键的多个表中选择sqlite结果

And*_*y M 5 sql sqlite select foreign-keys

我想从多个具有多个外键的表中选择sqlite中的结果,我试过JOIN但是效果不好; 例如 :

一张桌子STUDENT:

 CREATE TABLE STUDENT (
 STUDENT_NAME    TEXT        NOT NULL,
 STUDENT_NUMBER  INTEGER  PRIMARY KEY  NOT NULL,
 STUDENT_ADDRESS TEXT        NOT NULL
 );
Run Code Online (Sandbox Code Playgroud)

和一张桌子EXAMS:

 CREATE TABLE EXAMS(
 EXAM_CODE      INTEGER   PRIMARY KEY  NOT NULL,
 EXAM_SUBJECT   TEXT        NOT NULL,
 EXAM_LOCATION  TEXT        NOT NULL
 );
Run Code Online (Sandbox Code Playgroud)

还有一张表格WROTE_EXAM,用于为编写特定考试的学生提供信息

 CREATE TABLE WROTE_EXAM (
 STUDENT_NUMBER  INTEGER     NOT NULL,
 EXAM_CODE       INTEGER     NOT NULL,
 DATE            DATE        NOT NULL,
 FOREIGN KEY(STUDENT_NUMBER) REFERENCES STUDENT(STUDENT_NUMBER),
 FOREIGN KEY(EXAM_CODE) REFERENCES EXAMS(EXAM_CODE));
Run Code Online (Sandbox Code Playgroud)

这是插入表格的示例数据:

STUDENT_NAME : John
STUDENT_NUMBER: 123456789
STUDENT_ADDRESS : 10th street
EXAM_CODE: 123
EXAM_SUBJECT: One Subject
EXAM_LOCATION: Class
Run Code Online (Sandbox Code Playgroud)

现在,我想:
a)输出学生姓名,考试代码和学生位置,谁写了考试
b)输出考试代码,考试科目和考试地点为ID:123456789

谢谢

mu *_*ort 11

连接表时,您几乎总是希望包含显式连接条件.SQLite 语法图可能会有所帮助:

加入Op 加入约束

所以评论中的SQL看起来应该更像这样:

select student.student_name, exams.exam_code, ...
from student
join wrote_exam using (student_number)
join exams using (exam_code)
where ...
Run Code Online (Sandbox Code Playgroud)

或者你可以使用JOIN ... ON:

select student.student_name, exams.exam_code, ...
from student
join wrote_exam on student.student_number = wrote_exam.student_number
join exams on exams.exam_code = wrote_exam.exam_code
where ...
Run Code Online (Sandbox Code Playgroud)

然后添加where条件以根据需要过滤结果.

请注意,我还在SELECT子句中的列中添加了一些表限定符,需要这些限定符来唯一地指定exam_code您感兴趣的列,并且由于需要对一列进行限定,因此我为了一致性而完成了所有这些操作.在现实生活中,我会将它们作为前缀,以使事情变得美好和明确.

此外,我没有看到student_location任何地方,也许你的意思student.student_addressexams.exam_location.