正如我所说,我正在做一个项目。我的项目是一个管理学校家长会的系统。
这些是我的表格、关系等:
我的目标是在我的 API 中创建一个“getAllDates”函数。
在我的数据库中,日期表是所有“教师-家长会议”信息的存储位置。因此,我的 Dates 表包含一堆外键,即
在我的 API 代码中被转换为 Dates 模型中其他模型的实例,如下所示:
namespace ProjAPI.Models
{
public class Date
{
public DateTime DateInfo;
public Student Student;
public Teacher Teacher;
public Classroom Classroom;
public int Status, Id;
}
}
正如你想象的那样,每个实例都有自己的属性,我需要提供给他的属性。那是我的问题开始的时候。
那么让我们看看其他模型:
用户模型
namespace ProjAPI.Models
{
public class User
{
public string Name, LastName, Address, Phone, Pass, Email, Id;
public int Role, Status;
}
}
学生模型
namespace ProjAPI.Models
{
public class Student : User
{
public string YearAndClass;
}
}
教师模式
namespace ProjAPI.Models
{
public class Teacher : User
{
public Classroom Classroom;
}
}
课堂模式
namespace ProjAPI.Models
{
public class Classroom
{
public Building Building;
public string Id;
public string Name;
}
}
建筑模型
namespace ProjAPI.Models
{
public class Building
{
public string Id;
public int RoomNum;
}
}
所以,我需要一个查询:
1.获取老师和学生的所有信息,并重命名列
所以我可以在代码中访问它们。
2. 获取有关班级的所有信息,并将它们区分开来,以便我可以分别访问每个班级。
3. 获取有关日期的所有信息。
为了解决这个问题,我在查询中创建了临时表:
(
SELECT
Classes.ClassID as cID, Classes.ClassName as cName,
Buildings.BuildingID as bID, Buildings.RoomNum
FROM
Classes
FULL OUTER JOIN
Buildings
on
Classes.BuildingID = Buildings.BuildingID
) as cb,
cb 是一个临时表,代表我的 Dates 表中的类。
(
SELECT
Buildings.RoomNum as tcRoomNum,
Classes.ClassID as tcID, Classes.BuildingID as tcbID,
Classes.ClassName,ut.*
FROM
Classes,Buildings,
(
SELECT
UserID as tID, Name as tName, LastName as tLastName,
Status as tStatus, Role as tRole, Phone as tPhone,
Email as tEmail, Address as tAddress,Password as tPassword,
ClassID as clID
FROM
Users
LEFT JOIN
Teachers
ON
UserID = TeacherID
) as ut
WHERE
ut.clID=Classes.ClassID
AND Classes.BuildingID = Buildings.BuildingID
) as utcb,
utcb 是一个临时表,代表我的 Dates 表中的老师。
(
SELECT
UserID as sID, Name as sName, LastName as sLastName,
Status as sStatus, Role as sRole, Phone as sPhone,
Email as sEmail, Address as sAddress, Password as sPassword,
YearAndClass
FROM
Users
LEFT JOIN
Students
ON
UserID = StudentID
) as us
us 是一个临时表,用于代表我的 Dates 表中的学生。
现在,当我创建临时表时,我可以访问它们并正确过滤:
SELECT
DateInfo,DateID,Dates.Status as dStatus,us.*,utcb.*,cb.*
FROM
Dates,cb,utcb,us
WHERE
Dates.StudentID = us.sID
AND Dates.TeacherID = utcb.tID
AND Dates.ClassID = cb.cID
我知道我做得不好而且效率低下,但我一个人做这件事很艰难,我为自己感到骄傲。
如果有人对升级此查询有任何建议,请随时告诉我。