Sql Can';无法完成复杂的查询

Sql Can';无法完成复杂的查询,sql,ms-access,Sql,Ms Access,我有一个关于C#中SQL的问题,我想实现,但我有点卡住了。下表列出了一些示例数据: 学生: (PK)tagID studentID (FK)courseID 4855755 HUJ564334 25 4534664 RED231232 33 (FK)tagID (FK)sessionID scanningTime 4855755 1ACMP2343 课程 (PK)courseID courseName 25 Compute

我有一个关于C#中SQL的问题,我想实现,但我有点卡住了。下表列出了一些示例数据:

学生

(PK)tagID  studentID (FK)courseID
4855755    HUJ564334    25
4534664    RED231232    33
    (FK)tagID (FK)sessionID scanningTime
     4855755    1ACMP2343
课程

(PK)courseID courseName
25           Computer Science
33           Biology
(FK)courseID (FK)moduleID
25              CMP2343
25              CMP3456
33              BIO3422
33              BIO2217
(PK)moduleID moduleName
CMP2343      Networking
CMP3456      Databases
BIO3422      Human body
BIO2217      Genetics
(FK)tagID (FK)sessionID scanningTime
课程模块

(PK)courseID courseName
25           Computer Science
33           Biology
(FK)courseID (FK)moduleID
25              CMP2343
25              CMP3456
33              BIO3422
33              BIO2217
(PK)moduleID moduleName
CMP2343      Networking
CMP3456      Databases
BIO3422      Human body
BIO2217      Genetics
(FK)tagID (FK)sessionID scanningTime
模块

(PK)courseID courseName
25           Computer Science
33           Biology
(FK)courseID (FK)moduleID
25              CMP2343
25              CMP3456
33              BIO3422
33              BIO2217
(PK)moduleID moduleName
CMP2343      Networking
CMP3456      Databases
BIO3422      Human body
BIO2217      Genetics
(FK)tagID (FK)sessionID scanningTime
模块会话

(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)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   
出席人数

(PK)courseID courseName
25           Computer Science
33           Biology
(FK)courseID (FK)moduleID
25              CMP2343
25              CMP3456
33              BIO3422
33              BIO2217
(PK)moduleID moduleName
CMP2343      Networking
CMP3456      Databases
BIO3422      Human body
BIO2217      Genetics
(FK)tagID (FK)sessionID scanningTime
我正在使用RFID扫描仪扫描学生
tagID
。我希望我的查询为给定的
tagID
找到一个“当前”的
sessionID
(通过查找会话的日期和时间,以DB为单位),并在
考勤表中显示
tagID
sessionID
,以及扫描时间

为此,我需要:

  • 查看
    Student
    表中的内容并获取
    TagID
  • 查看此
    tagID
    与哪个课程相关(查看
    CourseID
    列)
  • 查看
    CourseModule
    表格,查看与课程相关联的模块
  • 查看
    ModuleSession
    表,查看哪些会话与模块关联
  • 查看
    Session
    表,检查“今天和现在”正在发生的
    sessionID
  • 考勤
    表中显示
    tagID
    sessionID
因此,如果我想为
tagID=4855755
查找当前会话,则
考勤
输出应为:

出席人数

(PK)tagID  studentID (FK)courseID
4855755    HUJ564334    25
4534664    RED231232    33
    (FK)tagID (FK)sessionID scanningTime
     4855755    1ACMP2343
这是因为:

  • 查看
    学生
    表格:学生4855755在课程ID=25
  • 查看
    CourseModule
    表:courseID=25两个模块的折衷方案:CMP2343和CMP3456
  • 查看
    模块会话
    表:模块CMP2343和CMP3456各2个会话的折衷:1ACMP2343;2ACMP2343和1ACMP3456;2ACMP3456
  • 查看
    会话
    表:今天和现在只进行会话1ACMP2343
我的问题是,如何编写查询以实现上述示例?我已经开始了这个查询,但是我需要一些帮助来让它正常工作

代码是:

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();
(更新)我班的C#代码是:

    public void setSQL()
        {
            string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Kacper\\Desktop\\AutoReg\\AutoReg\\AutoReg.accdb;";`

            OleDbConnection MyConn = new OleDbConnection(ConnStr);
            MyConn.Open();

            DataSet ds = new DataSet();

            //query to ask
            string query = @"SELECT s.TagID, se.SessionID, " + "'" + 
DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + @"' AS scanningTime 

                            FROM Student s,
                            CourseID-ModuleID cm,
                            ModuleID-SessionID ms,
                            Session se

                            WHERE 1=1 
                            AND s.TagID = 4820427
                            AND s.CourseID = cm.CourseID
                            AND ms.ModuleID = cm.ModuleID
                            AND ms.SessionID = se.SessionID
                            AND se.SessionDate = Date();";

            OleDbCommand command = new OleDbCommand(query, MyConn);
            OleDbDataAdapter adapter = new OleDbDataAdapter(command);

                adapter.Fill(ds);
                dataGridView2.DataSource = ds.Tables[0];
                MyConn.Close();

        }
我已更新了SQL代码,但仍无法使其运行,我获取并出错: System.Data.dll中发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常 其他信息:IErrorInfo.GetDescription因E#U FAIL(0x80004005)而失败。

为了使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与Student s的
在同一行中有一个额外的
会话se
,并有
s.SessionDate
而不是
se.SessionDate

尝试在第二个SQL中爆破注释;我已经很久没有在Access上抛出SQL了

过了这一步,你可能会进入另一个问题。尝试标准的调试动作——您是否可以运行更简单的查询,如
query=“SELECT*FROM Student”从同一地点无错误

为了使您的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与Student s的
在同一行中有一个额外的
会话se
,并有
s.SessionDate
而不是
se.SessionDate

尝试在第二个SQL中爆破注释;我已经很久没有在Access上抛出SQL了


过了这一步,你可能会进入另一个问题。尝试标准的调试动作——您是否可以运行更简单的查询,如
query=“SELECT*FROM Student”从同一地点无错误

我已经设法完成了这个查询工作。表名周围需要方括号

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

我已经成功地完成了这个查询工作。表名周围需要方括号

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

只是为了澄清一切。您的问题是要编写SQL查询以从SQL Server数据库检索该信息吗?尤其是在C#中:不应该。您当前的查询有什么问题,除了从
中删除
之后的第一个
会话se
之外,我认为您不希望
s.SessionDate
但是
se.SessionDate
靠近末尾,对吗?正如@gustavodidomenico提到的,我不认为这个问题与C#无关。好的,我在C#应用程序中使用这个查询,它从Access(不是SQL Server DB)检索本地数据库的信息,从不混合隐式连接和显式连接,它们通常可以给出wornfg答案,因为在许多数据库中,显式连接是首先计算的。事实上,您根本不应该使用隐式连接,因为它们是一种SQL反模式,会导致问题并使代码更难维护。只是为了澄清一切。您的问题是要编写SQL查询以从SQL Server数据库检索该信息吗?尤其是在C#中:不应该。您当前的查询有什么问题,除了从
中删除
之后的第一个
会话se
之外,我认为您不希望
s.SessionDate
但是
se.SessionDate
靠近末尾,对吗?而且,正如@gustavodidomenico所提到的,没有什么特别与C#有关的