【问题标题】:SQL Case statement to join tables连接表的 SQL Case 语句
【发布时间】:2016-07-31 03:38:59
【问题描述】:

我正在处理三个包含以下列的表格:

  • students(name TEXT, Courseid INTEGER, score INTEGER) 例如:('TOM', 6120,85)
  • courses(courseid INTEGER, name TEXT,classic TEXT) 例如:(6110, 'Science', 'LSB105')
  • gradingscheme(letter TEXT, lower REAL, upper REAL) 例如:('A', 90, 100)

我正在尝试加入所有三个表,以便它包括根据学生表中的分数在 gradingscheme 表中指定的每个学生的字母等级。我在 Python 中使用 sqlite3 库。我写的sql语句如下:

SELECT s.name, s.courseid, c.name, c.classroom, s.score, CASE g.letter WHEN s.score BETWEEN g.upper AND g.lower
FROM students AS s, courses AS c, gradingscheme AS g
WHERE s.courseid=c.courseid

但是,我遇到了一个错误。最后两行报错如下:

WHERE s.courseid=c.courseid''')

sqlite3.OperationalError: “FROM”附近:语法错误

请帮忙

编辑代码:

SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter
FROM students AS s
INNER JOIN courses AS c
ON s.courseid=c.courseid
INNER JOIN gradingscheme AS g
ON CASE g.letter WHEN s.score BETWEEN g.lower AND g.upper

现在我收到错误:

ON CASE g.letter WHEN s.score BETWEEN lower and upper''') sqlite3.OperationalError:靠近“上部”:语法错误

可能我不知道如何使用 CASE 语句进行条件连接

【问题讨论】:

  • 学习使用正确的显式JOIN 语法。简单规则:从不FROM 子句中使用逗号。
  • 谢谢戈登。我现在更改了代码并使用了 Inner Join。但是,我收到了如上面编辑过的问题所示的错误。我可能无法在这里弄清楚如何使用 case 语句。

标签: python sql sqlite


【解决方案1】:

不需要大小写——只需使用“and”

SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter
FROM students AS s
INNER JOIN courses AS c
ON s.courseid=c.courseid
INNER JOIN gradingscheme AS g
ON s.score > g.lower AND s.score < g.upper

【讨论】:

  • 非常感谢霍根。我是编码新手,没有意识到它是如此简单
【解决方案2】:

您无需使用 case 语句使查询过于复杂,只需将连接条件指定为 s.score &gt; g.lower AND s.score &lt;= g.upper

SELECT s.name, s.courseid, c.name, c.classroom, s.score, g.letter
FROM students AS s
JOIN courses AS c
ON s.courseid=c.courseid
JOIN gradingscheme AS g
ON s.score > g.lower AND s.score <= g.upper

注意上限的小于或等于&lt;= 运算符,因为没有这个,得分100 的人根本不会排名。

使用 BETWEEN 是危险的,因为它在不同的数据库中意味着不同的东西。在 sqlite 中,BETWEEN 包括下限和上限,这意味着 90 的分数介于 80 和 90 之间,并且 介于 90 和 100 之间。您会出现分数为 90 的学生两次使用此条件的两个等级。通过使用&gt; g.lower and &lt;= g.upper,您可以安全地将评分方案指定为 70-80、80-90、90-100,并确保没有冲突/重叠,因为您在比较运算符中已经明确。

【讨论】:

  • 非常感谢您在代码中的细枝末节。将
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多