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) )
我需要加入三个 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) )