sql 加入范围,为单条记录提供双行

sql join on range giving double row for single record

我需要加入三个 tables Result、ResultITems 和 GradeScale。当我这样做时,我会得到同一行的两倍或两份。我尝试在 sqlfiddle 中创建记录,但我得到了不同的正确结果。我在本地 sqlite 数据库中创建 table 时使用的模式完全相同,如下所示。

结果table

CREATE TABLE Result ( 
    ID        INTEGER PRIMARY KEY AUTOINCREMENT,
    SubjectID INTEGER REFERENCES Subjects ( ID ) ON DELETE CASCADE, 
    SessionID INT     REFERENCES Sessions ( ID ),
    TermID    INT     REFERENCES terms ( ID ),
    ClassID   INTEGER REFERENCES Classes ( ID )
);

结果项table

CREATE TABLE ResultItems ( 
    StudentID INTEGER,
    ResultID  INTEGER REFERENCES Result ( ID ) ON DELETE CASCADE,
    Total     DECIMAL( 10, 2 ) 
);

和等级table

CREATE TABLE gradeScale
(ID INTEGER PRIMARY KEY AUTOINCREMENT,
    minscore tinyint NOT NULL,
 maxscore tinyint NOT NULL,
 grade char(1) NOT NULL,
    ClassCatID INTEGER 
);

现在,当我在下面执行此查询时,我为 ResultItems 中的每条记录设置了双行 table

Select ri.studentid, ri.Total,g.grade
From ResultItems ri

left join GradeScale g
ON ( ri.total >= g.minscore AND ri.total <= g.maxscore )

left join Result r on r.id=ri.resultid

 WHERE r.sessionid = 4 
       AND
       r.termid = 1 
       AND
       r.classid = 9
 ORDER BY grade ASC;

请看下图明白我的意思 ![在此处输入图片描述][1]

这是我创建的 sql 小问题 http://sqlfiddle.com/#!7/ffb42/1

为什么我在本地数据库中执行时在输出中得到双行?

在@JotaBet 的帮助下,我能够将错误追溯到 GradeScale table wihci 为每个 class 组的每个等级字母输入了两个条目。

所以我重写了 sql 以注意到这一点

left join GradeScale g
ON ( AND c.classcatid =  g.classcatid (ri.total >= g.minscore AND ri.total <= g.maxscore) )