【问题标题】:Why do I get a syntax error for "LEFT [OUTER] JOIN"? [closed]为什么我会收到“LEFT [OUTER] JOIN”的语法错误? [关闭]
【发布时间】:2021-03-31 10:29:08
【问题描述】:

我有 3 张桌子:

  • 具有以下列的学生:Id(pk)、FirstName、LastName、BirthDate、GroupId(fk);
  • 主题包含以下列:Id(pk)、名称;
  • Student_Grade_Subject 包含以下列:StudentId、SubjectId(composed pk)、Grade(int);

所以我的问题是,返回每个学生成绩平均值的查询看起来如何?我知道我必须进行外部联接,因为并非所有学生都有成绩。

这是我迄今为止尝试过的,但我得到“OUTER 附近的语法不正确”。

 select s.Id, MEAN(Grade) from dbo.Student s , dbo.Student_Grade_Subject
 sgs LEFT [OUTER] JOIN dbo.Student_Grade_Subject on s.id =
 sgs.StudentId group by s.Id;

【问题讨论】:

  • 语法图中的方括号表示语法的可选元素。从实际查询中删除它们。
  • 不要使用旧式连接,也不要将旧式连接与更合适的 JOIN 语法混合使用。
  • 更合适的JOIN语法是什么?
  • 一个 ANSI-92 INNER JOINCROSS JOIN(这就是你在这里所拥有的)。
  • 您在 Student_Grade_Subject 和 Student_Grade_Subject 之间使用了旧式联接,同时又将 JOIN 与 Student_Grade_Subject 一起使用。重来。为您的表格提供简短而有意义的别名 - 所有表格都应该有它们,而不仅仅是其中的一些。您正在学习坏习惯并助长自己(和他人)的困惑。

标签: sql sql-server join left-join


【解决方案1】:

首先,让我们更好地格式化 SQL;阅读您自己的代码总是一个好主意,并且在向其他人展示代码时真的一个好主意:

SELECT 
    s.Id,
    MEAN(Grade)
FROM
    dbo.Student s,
    dbo.Student_Grade_Subject sgs
LEFT [OUTER] JOIN
    dbo.Student_Grade_Subject 
    ON s.id = sgs.StudentId
GROUP BY
    s.Id;

现在让我们看看你哪里出错了:

  • 用逗号分隔表是一种老式的连接方式。您可能会在非常旧的示例中看到它,但在新代码中永远不需要它。 dbo.Student, dbo.Student_Grade_Subject 表示取 Student 中的 每一 行,并将其与 Student_Grade_Subject 中的 每一 行相匹配(“交叉连接”),除非 WHERE 子句另有说明。
  • 当语法示例将内容放在方括号中时,它们只是告诉您该词是可选的(SQL 中有很多可选词,试图使其读起来像自然语言),而不是您必须编写查询中的方括号。所以你可以写LEFT OUTER JOINLEFT JOIN,但不能写LEFT [OUTER] JOIN
  • 因为您有逗号连接和左连接,所以在此查询中实际上有 三个 表:dbo.Studentdbo.Student_Grade_Subject 您别名为 @987654329 @,第二个 dbo.Student_Grade_Subject 没有别名。您的 ON 条件提到了逗号连接的表,而不是左连接的表,因此不会做您想做的事情。

解决这一切,我们得到了这个:

SELECT 
    s.Id,
    MEAN(Grade)
FROM
    dbo.Student s
LEFT OUTER JOIN
    dbo.Student_Grade_Subject sgs
    ON s.id = sgs.StudentId
GROUP BY
    s.Id;

作为一个好习惯,我建议将MEAN(Grade)写成MEAN(sgs.Grade);随着查询变得越来越复杂,能够一目了然地看到每列来自哪个表是很有用的。

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多