2

嗨,堆栈溢出的新人,所以如果我没有正确呈现这个,我很抱歉。

我使用过 Google、W3schools 并阅读了 SQL 上的 FQA。

我正在使用 WAMP2.0 中的 SQL 命令行运行 SQL。我目前正在做一个项目,目的是创建一个最小的大学数据库。与学生、成绩、课程、模块等

其中一项任务是列出所有学生、模块和相应的成绩。为此,我尝试使用 JOIN 命令从学生表中选择所有名称,并从记录表中选择所有相应的模块 + 成绩。

+------------+-------+------------+-----------------+
| Student_id | Name  | DOB        | Address         |
+------------+-------+------------+-----------------+
|    4665236 | Paddy | 1985-09-18 | 123 Fake Street |
|    5665236 | Paul  | 1984-06-12 | Good manlane    |
|    6665236 | John  | 1984-03-09 | Docotor town    |
|    7665236 | Aidan | 1983-07-09 | Banker worlds   |
|    8665236 | Joe   | 1983-07-09 | 24 hitherwood   |
+------------+-------+------------+-----------------+

+------------+--------+------+-------+
| Student_id | Mod_id | GPA  | Grade |
+------------+--------+------+-------+
|    4655236 |   2222 | 3.84 | A-    |
|    5655236 |  11111 | 3.44 | B+    |
|    6655236 |  33333 | 3.24 | B     |
|    7655236 |  44444 | 2.45 | C-    |
|    8655236 |  44444 | 2.45 | C-    |
+------------+--------+------+-------+

学生表中的主键是 Student_id INT 11

记录的主键是 (Student_id,Mod_id)

单独的 SELECT FROM 语句在两个表上都可以正常工作。

使用时出现问题

SELECT students.Name, records.Grade
FROM students
INNER JOIN records
ON students.Student_id=Student_id
ORDER BY students.Name

我收到以下错误

错误 1052 (23000):on 子句中的列 'Student_id' 不明确

感谢我尝试的惊人的快速响应

SELECT students.Name, records.Grade FROM students INNER JOIN records ON students.Student_id=records.Student_id ORDER BY students.Name;

得到 ---- 空集(0.00 秒)?

4

3 回答 3

1

Student_Id您必须使用别名来限定该列,例如这样它在子句records.studentId中不会有歧义,或者:ON

SELECT s.Name, r.Grade
FROM students AS s
INNER JOIN records AS r ON s.Student_id= r.Student_id
ORDER BY s.Name
于 2013-03-15T14:29:13.607 回答
1

您需要为列提供表名Student_id以避免歧义,因为它都存在于两个表中。

SELECT students.Name, records.Grade
FROM   students
       INNER JOIN records
          ON students.Student_id = records.Student_id -- << THIS
ORDER  BY students.Name
于 2013-03-15T14:29:24.350 回答
0

您的列名被标记为不明确的原因是因为您有两个不同的表,每个表都有该Student_id字段。您可以将一个表连接到自身,因此即使您在字段的第一个实例上有一个标识符,您也需要一个标识符。

试试下面的代码:

SELECT students.Name, records.Grade
FROM students
INNER JOIN records
ON students.Student_id=records.Student_id
ORDER BY students.Name

如果这有助于您的代码看起来更干净,您还可以使用以下方法为表起别名:

SELECT s.Name, r.Grade
FROM students s
INNER JOIN records r
ON s.Student_id=r.Student_id
ORDER BY s.Name

但是,这仅在两个表中的学生 ID 匹配时才有效。在您提供的示例数据中,没有匹配的记录。4665236 != 4655236

于 2013-03-15T14:34:06.050 回答