无法完成复杂的查询

时间:2013-05-09 18:36:24

标签: sql ms-access

我有一个关于C#中的SQL的问题我想实现但是我有点卡住了。以下是包含一些示例数据的表格:

学生

(PK)tagID  studentID (FK)courseID
4855755    HUJ564334    25
4534664    RED231232    33

课程

(PK)courseID courseName
25           Computer Science
33           Biology

CourseModule

(FK)courseID (FK)moduleID
25              CMP2343
25              CMP3456
33              BIO3422
33              BIO2217

模块

(PK)moduleID moduleName
CMP2343      Networking
CMP3456      Databases
BIO3422      Human body
BIO2217      Genetics

ModuleSession

(FK)moduleID (FK)sessionID
CMP2343      1ACMP2343
CMP2343      2ACMP2343 
CMP3456      1ACMP3456
CMP3456      2ACMP3456
BIO3422      1ABIO3422      
BIO3422      2ABIO3422
BIO2217      1ABIO2217      
BIO2217      2ABIO2217   

会话

(PK)sessionID sessionStartDate sessionTimeStart sessionTimeEnd
1ACMP2343      09/05/2013          12:00 AM         14:00 PM
2ACMP2343      05/05/2013          09:00 AM         11:00 PM
1ACMP3456      15/05/2013          12:00 AM         13:00 PM
2ACMP3456      01/05/2013          10:00 AM         13:00 PM
1ABIO3422      30/04/2013          11:00 AM         13:00 PM
2ABIO3422      01/04/2013          14:00 AM         16:00 PM
1ABIO2217      12/05/2013          16:00 AM         18:00 PM
2ABIO2217      03/05/2013          12:00 AM         14:00 PM   

考勤

(FK)tagID (FK)sessionID scanningTime

我正在使用RFID扫描仪扫描学生tagID。我希望我的查询能够找到给定sessionID的“当前”tagID(通过查找会话的日期和时间,保存在数据库中),并显示TagID和{ SessionID表格中的{1}}以及扫描时间。

为实现这一点,我需要:

  • 查看Attendance表格并获取Student
  • 查看此TagID与哪个相关的课程(查看tagID列)
  • 查看CourseID表,了解与课程相关的模块
  • 查看CourseModule表以查看与模块关联的会话
  • 查看ModuleSession表,查看今天发生了哪个Session现在“
  • sessionID表格
  • 中显示tagIDsessionID

因此,如果我想查找Attendance的当前会话,则tagID = 4855755输出应为:

考勤

Attendance

这是因为:

  • 查看 (FK)tagID (FK)sessionID scanningTime 4855755 1ACMP2343 表:学生4855755在课程ID = 25
  • 查看Student表:courseID = 25个两个模块的妥协:CMP2343和CMP3456
  • 查看CourseModule表:模块CMP2343和CMP3456每个2个会话的危害:1ACMP2343; 2ACMP2343和1ACMP3456; 2ACMP3456
  • 查看ModuleSession表:今天只有会议1ACMP2343正在进行

我的问题是如何编写查询以便能够实现上述示例?我已经开始查询,但我需要一些帮助才能使它按原样运行。

代码是:

Session

(更新)我班的C#代码是:

SELECT Student.tagID, Session.sessionID 
FROM Student s , Session se
INNER JOIN Course c ON c.courseID = s.courseID
INNER JOIN CourseModule cm ON cm.courseID = c.courseID
INNER JOIN Module m ON m.moduleID = cm.moduleID
INNER JOIN ModuleSession ms ON ms.moduleID = cm.moduleID
INNER JOIN Session se ON se.sessionID = ms.sessionID
INNER JOIN Attendance a ON a.sessionID = se.sessionID 
WHERE Student.tagID = 4820427
AND s.SessionDate=DATE();

我已经更新了我的SQL代码,但仍然无法让它运行,我得到并且错误: System.Data.dll中发生了未处理的“System.Data.OleDb.OleDbException”类型异常 其他信息:IErrorInfo.GetDescription因E_FAIL(0x80004005)而失败。

2 个答案:

答案 0 :(得分:1)

为了使您的C#更易于阅读,您可能希望使用“@”约定来插入换行符。我要为第三个字段作弊 - 我想你希望输出是你运行查询的时间。

query = @"SELECT s.tagID, se.sessionID, " + 
    "'" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + @"' AS scanningTime 
    FROM Student s
    INNER JOIN Course c ON c.courseID = s.courseID
    INNER JOIN CourseModule cm ON cm.courseID = c.courseID
    INNER JOIN Module m ON m.moduleID = cm.moduleID
    INNER JOIN ModuleSession ms ON ms.moduleID = cm.moduleID
    INNER JOIN Session se ON se.sessionID = ms.sessionID
    INNER JOIN Attendance a ON a.sessionID = se.sessionID 
    WHERE Student.tagID = 4820427
    AND se.SessionDate=DATE()";

我认为实际上有几种方法可以清理它。你需要课程的任何价值吗?如果没有,请删除该连接。与模块和模块会话相同。

query = @"select s.tagID, ms.sessionId, " + 
    "'" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + @"' AS scanningTime 

    from student s,
    coursemodule cm,
    modulesession ms,
    session sess

    WHERE 1=1
    and s.tagID = 4820427
    and s.courseId = cm.courseId
    and ms.moduleId = cm.moduleId
    and ms.sessionId = sess.sessionId
    and sess.sessionStartDate = Date()";

请注意,您的SQL在与Session se相同的行中有一个额外的FROM Student s,并且s.SessionDate代替se.SessionDate

尝试在第二个SQL中爆破注释;自从我在Access上抛出SQL以来,已经有很长一段时间了。

过去,你可能会转向另一个问题。尝试标准的调试动作 - 你可以从同一个地点运行一个更简单的查询,比如query = "SELECT * FROM Student";而没有错误吗?

答案 1 :(得分:0)

我设法让这个查询工作。它需要围绕表名的方括号。

string query = @"SELECT s.TagID, se.SessionID, '" + 
           DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + 
           "' AS scanningTime " + 
           "FROM (((Student s " + 
           " LEFT JOIN [CourseID-ModuleID] cm ON s.CourseID = cm.CourseID) " + 
           " LEFT JOIN [ModuleID-SessionID] ms ON ms.ModuleID = cm.ModuleID) " + 
           " LEFT JOIN [Session] se ON ms.SessionID = se.SessionID) " + 
           "WHERE s.TagID = 4820427 AND se.SessionDate = Date()";