Sql Can';无法完成复杂的查询
我有一个关于C#中SQL的问题,我想实现,但我有点卡住了。下表列出了一些示例数据: 学生: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
(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#有关的