用于连接表的SQL Case语句

时间:2016-04-09 23:22:29

标签: python sql sqlite

我使用以下列处理三个表:

  • 学生(姓名TEXT,Courseid INTEGER,得分INTEGER)例如:('TOM',6120,85)
  • 课程(例如INTIDER,名称TEXT,课堂TEXT)例如:(6110,'Science','LSB105')
  • gradingscheme(字母TEXT,低REAL,高REAL)例如:('A',90,100)

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

<?php

$Imagesrc = C('Plugin.IndexPostImage.Image','/images/default.png');

preg_match(
    '#\<img.+?src="([^"]*).+?\>#s',
    $Sender->EventArguments['Post']->Body,
    $images
);

$thumbs = "";
for ($i = 1; $i <= 5; $i) {
    if(!empty($images[$i])) {
        $thumbs .= '<a class="IndexImg" href="' .
            $Sender->EventArguments['Post']->Url . '">' .
            Img($images[$i], array('title' => $sline, 'class' => "IndexImg")) . '</a>';
    } else {
        break;
    }
}

echo "$thumbs";

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

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

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

请帮忙

编辑代码:

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

现在我收到了错误:

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

可能,我无法弄清楚如何使用CASE语句进行条件连接

2 个答案:

答案 0 :(得分:0)

无需案例 - 只需使用“和”

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

答案 1 :(得分:0)

您不需要使用case语句过度复杂化查询,只需将连接条件指定为s.score > g.lower AND s.score <= 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

注意上限范围内的<=运算符小于或等于,因为如果没有这个,则得分为100的人将不会被排名。

使用BETWEEN是危险的,因为它意味着不同数据库中的不同内容。在sqlite中,BETWEEN包括较低和较高范围,这意味着得分90在80和80之间。在90&amp; 90之间 100.使用这种情况,你会得到两个成绩为90分的学生。通过使用> g.lower and <= g.upper,您可以安全地将评分方案指定为70-80,80-90,90-100,并确保没有冲突/重叠,因为您已在比较运算符中明确指出。