5

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

一个表STUDENT

 CREATE TABLE STUDENT (
 STUDENT_NAME    TEXT        NOT NULL,
 STUDENT_NUMBER  INTEGER  PRIMARY KEY  NOT NULL,
 STUDENT_ADDRESS TEXT        NOT NULL
 );

和一张桌子EXAMS

 CREATE TABLE EXAMS(
 EXAM_CODE      INTEGER   PRIMARY KEY  NOT NULL,
 EXAM_SUBJECT   TEXT        NOT NULL,
 EXAM_LOCATION  TEXT        NOT NULL
 );

和一个表格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));

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

STUDENT_NAME : John
STUDENT_NUMBER: 123456789
STUDENT_ADDRESS : 10th street
EXAM_CODE: 123
EXAM_SUBJECT: One Subject
EXAM_LOCATION: Class

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

谢谢

4

1 回答 1

11

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

加入欧普 加入约束

因此,您评论中的 SQL 应该看起来更像这样:

select student.student_name, exams.exam_code, ...
from student
join wrote_exam using (student_number)
join exams using (exam_code)
where ...

或者你可以使用 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 ...

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

请注意,我还在您的 SELECT 子句中的列中添加了一些表限定符,这些是唯一指定exam_code您感兴趣的列所必需的,并且由于需要对一列进行限定,为了保持一致性,我做了所有这些;在现实生活中,我会将它们全部添加到前缀以使事情变得更好和明确。

另外,我在任何地方都看不到student_location,也许您的意思是student.student_addressor exams.exam_location

于 2013-11-05T04:39:50.993 回答