sql连接范围为单个记录提供双行

时间:2015-01-27 15:26:26

标签: sql sqlite

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

结果表

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 )
);

resultItems表

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

等级表

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

现在当我执行下面的查询时,我为ResultItems表中的每条记录添加了一行

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]

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

的sql fibble

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

1 个答案:

答案 0 :(得分:1)

从@ JotaBet的帮助中,我能够将错误跟踪到GradeScale表,wihci为每个班级组的每个成绩单都有两个条目。

所以我重写了sql以注意到

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