【问题标题】:How to fix errors in SQL Joins?如何修复 SQL 连接中的错误?
【发布时间】:2018-11-06 03:24:16
【问题描述】:

Courses

Instructors

Sections

Students

StudentSchedule

StudentSchedule Part 2

使用提供的数据库,Write and Execute SELECT statements得到以下信息:

简单连接

分段表

  1. 讲师 6 的教学总学分是多少?

我尝试了什么:

select sum(c.credithours) 
from courses c
join sections s on c.courseid = s.courseid
join instructors i on s.instructor = i.ID
                   and s.instructor = 6; 

错误:

FROM 子句中的语法错误

  1. 请提供 1147 教室所有课程的 CRN、课程名称、描述和学时、上课时间和房间号。是否有任何冲突?

我尝试了什么:

select CRN, CourseName, description, credithours, timedays, roomno
from courses c
join sections s on c.courseid = s.courseid
join instructors i on s.instructor = i.ID
                   and roomno = "F1147";

错误:

FROM 子句中的语法错误

学生时间表

  1. 提供已为 CRN=30101 部分注册的学生姓名和 ID 的列表。 (列出学生的名字、姓氏、身份证和 CRN)

我尝试了什么:

select firstname, lastname, ID, CRN 
from studentschedule ss
join students s on ss.student_id = s.id
                and CRN = 30101;

错误:

FROM 子句中的语法错误

  1. 请列出 CRN=30115 部分中的所有学生姓名(名字和姓氏)。

我尝试了什么:

select firstname, lastname, ID, CRN 
from studentschedule ss
join students s on ss.student_id = s.id
                and CRN = 30115;

错误:

FROM 子句中的语法错误

  1. 请列出学生 id=6 正在参加的所有部分的所有部分信息。

我尝试了什么:

select s.* 
from studentschedule ss
join sections s on ss.CRN = s.CRN
                and studentid = 6;

错误:

FROM 子句中的语法错误

  1. 高级(多表):请列出课程名称、CRN 以及 CRN=30115 部分中所有学生的姓名。

我尝试了什么:

select firstname, lastname, ID, CRN, coursename
from studentschedule ss
join students s on ss.student_id = s.id
join sections sec on ss.CRN = sec.CRN
join courses c on sec.courseid = c.courseid
               and CRN = 30115;

错误:

FROM 子句中的语法错误

【问题讨论】:

  • 嗨。请use text, not images/links, for text (including code, tables & ERDs)。使用链接/图像仅是为了方便补充文本和/或无法在文本中给出的内容。永远不要给出没有图例/键的图表。如果您有代表,请使用编辑功能内联,而不是链接 - 使您的帖子独立。请对minimal reproducible example采取行动。请每个问题问一个问题。显示您可以正确执行哪些部分和相关查询,并就您卡在哪里提出具体问题。请参阅编辑帮助重新格式化文本。打印代码直到正确为止。
  • 你真的问了一个问题中的所有问题?
  • 查询看起来不错。 Syntax error in FROM clause 是一个非常广泛的错误消息。这真的是你得到的全部吗?您使用的是哪个 DBMS?它的消息应该更加明确。
  • 双引号用于分隔标识符。您是否有名为"F1147" 的列,或者您正在搜索'F1147' 字符串值。
  • 请阅读 How to Ask 和向下投票箭头鼠标悬停文本并点击谷歌搜索“stackexchange 作业”。带有“site:stackoverflow.com”的错误消息的谷歌给出了许多适当的答案。

标签: sql join inner-join self-join clause


【解决方案1】:

Access 本身没有 JOIN。

您必须使用 INNER JOIN、LEFT JOIN 或 RIGHT JOIN - 否则会出现该错误。

例如:问题 1 的解决方案是:

SELECT Sum([CreditHours]) AS totalHours
FROM Courses INNER JOIN Sections ON Courses.CourseID = Sections.CourseID
WHERE (((Sections.Instructor)=6));

请注意,您根本不需要教练表,除非他们要求提供有关教练的姓名或其他详细信息。

另请注意:我不会担心在这样一个简单的查询中使用短表名进行优化。

【讨论】:

  • 这个答案几乎没有任何意义。我们可以清楚地看到,Marc 正在使用JOIN 加入表格。这是INNER JOIN 的缩写。
  • 我在 Microsoft Access 方面有 10 年的经验...如果您只是使用 JOIN 而不是 INNER JOIN - 您得到的错误是:“FROM 子句中的语法错误” - 这种情况等等。如果您在我的回答中注意到括号 - 我从 Access 中的工作查询中删除了此代码 - 请在您投反对票之前检查 - 这不好。
  • 我认为这个答案具有误导性。这就是向下投票箭头的用途。您的问题 Marc 是否加入表格表明您没有查看他的查询。建议使用INNER JOIN 而不是JOIN 没有意义,因为JOININNER JOIN 的缩写。然后您发布了一个无效的 SQL 查询(根据标准 SQL)。现在您告诉我,您假设 Marc 使用 MS Access,这就是错误的根源。但是您在回答中没有提到这一点。 (顺便说一下,您可以询问请求评论部分中使用的 DBMS。)
  • 您可能希望将您的答案更新为“您的查询看起来不错。从您收到的错误消息中,我推断您正在使用 MS Access。此 DBMS 不符合 SQL 标准完全不需要并且需要特殊的语法。例如,与其他 DBMS 不同,MS Access 要求您拼写 INNER JOIN 而不是仅使用 JOIN。在这点和许多其他点上都违反了 SQL 标准。我建议您使用另一个 DBMS用于学习。否则,您将不得不重写您正在编写或在 Internet 上找到的大多数查询。这是您重写为 MS Access SQL 的第一个查询:.."。
  • 将您的答案更改为类似的内容,我将删除我的反对票。
猜你喜欢
  • 2019-02-14
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2017-09-13
相关资源
最近更新 更多