Идея состоит в том, чтобы заставить SQL выполнять работу, а не делать это за нее.
Предполагая три таблицы:
Student (StudentNo, StudentName)
Class (ClassNo, ClassName)
Результат (ClassNo, StudentNo, Grade)
Запрос будет:
SELECT StudentName, group_concat(ClassName || "," || Grade)
FROM Student
INNER JOIN Result ON Result.StudentNo=Student.StudentNo
INNER JOIN Class ON Result.ClassNo=Class.ClassNo
GROUP BY Student.Studentno;
(group_concat - еще одно позднее добавление к SQlite. Присутствует в 3.7).
Вот дамп всех команд, которые я использовал:
CREATE TABLE [Student] (
[StudentNo] INTEGER NOT NULL PRIMARY KEY,
[StudentName] TEXT NULL
);
INSERT INTO "Student" VALUES(1,'Jimmy');
INSERT INTO "Student" VALUES(2,'Bob');
INSERT INTO "Student" VALUES(3,'Anna');
CREATE TABLE [Class] (
[ClassNo] INTEGER NOT NULL PRIMARY KEY,
[ClassName] TEXT NULL
);
INSERT INTO "Class" VALUES(1,'English');
INSERT INTO "Class" VALUES(2,'Algebra');
INSERT INTO "Class" VALUES(3,'Geometry');
INSERT INTO "Class" VALUES(4,'Pre-Cal');
CREATE TABLE [Result] (
[StudentNo] INTEGER NOT NULL,
[ClassNo] INTEGER NOT NULL,
[Grade] INTEGER NOT NULL,
PRIMARY KEY ([StudentNo],[ClassNo])
);
INSERT INTO "Result" VALUES(1,1,70);
INSERT INTO "Result" VALUES(1,2,75);
INSERT INTO "Result" VALUES(1,3,80);
INSERT INTO "Result" VALUES(2,1,85);
INSERT INTO "Result" VALUES(2,2,90);
INSERT INTO "Result" VALUES(3,4,95);
Выполнение запроса возвращает это (вы можете настроить разделительный символ):
Jimmy,English,70,Algebra,75,Geometry,80
Bob,English,85,Algebra,90
Anna,Pre-Cal,95