c# - 更新联接查询不更新表中的记录
问题描述
在我的出勤表中,我想用桥接表更新记录,但它没有更新S_ID
。C_ID
StudentCourse
当我使用它来选择和显示表格中的 2 列和StudentCourse
表格中的 1 列Attendance
时它可以工作,但是当我使用它来更新目前为空的出勤表时它不起作用
UPDATE Attendance
SET S_ID = sc.S_ID,
C_ID = sc.C_ID
FROM Attendance a
left outer join StudentCourse sc ON a.S_ID = sc.S_ID
WHERE sc.S_ID=2 and sc.C_ID=2
实际上有两个四个表:
- 学生(S_ID(主键))
- 课程(C_ID(主键))
- StudentCourse((S_ID,C_ID(外键))桥表)
- 和考勤表(S_ID,C_ID(外键))
我正在做的是datagridview
通过连接表并从所有这些表中选择、 和S_ID
(S_Name
表列)列来显示数据。C_ID
Pre_Abs
Attendance
datagridview
现在,当我单击按钮时,我想将存在的信息插入到考勤表中。
我已经通过使用datagrdview.rows[i].cell[2]
属性对出勤表进行简单的插入查询来完成此操作。
我想知道是否有更好的想法来做到这一点,以便我可以使用JOIN
而不是使用datagridview
带有 for 循环的属性。
目前,我的出勤表是空的,而Student
、Course
和StudentCourse
表中都填满了数据。
我想要的是从表中显示记录(S_ID
,C_ID
)和从studentCourse
表中显示(Pre_Abs
)Attendance
以及当我提交出勤时;我希望它在出勤表中存储Pre_abs
针对每个的记录S_ID
。C_ID
我不认为我可以进一步解释它。
解决方案
嗯。我不明白您的Attendance
表首先存在的原因。您的StudentCourse
表格似乎已经包含有关哪些学生正在学习哪些课程的信息。我只是假设该Attendance
表必须处理课程中每个讲座/课程的学生出勤率。
无论如何,正如@Psi 已经评论的那样,您最初似乎希望一个 INSERT 查询在表中创建一条记录,其中Attendance
包含基于表中信息的数据StudentCourse
。我猜你是想得太用力了。;-) 你可以尝试这样的事情:
INSERT INTO Attendance (S_ID, C_ID, Pre_Abs)
SELECT S_ID, C_ID, Pre_Abs
FROM StudentCourse
WHERE S_ID = 2 AND C_ID = 2
但是,目前尚不清楚Pre_Abs
应如何填写字段...您尝试从 table 获取它Attendance
,但这似乎是无效的。
此外,在创建 INSERT 查询时,请确保源数据值(在 SELECT 或 VALUES 子句中)与目标字段(在 INSERT 子句中)的顺序相同。如果字段/值顺序不匹配,则数据会混淆(如果查询没有因数据类型错误而失败)!
最后但并非最不重要的一点是:如果Attendance
和StudentCourse
表共享相同的复合键(S_ID, C_ID)
,则在连接这些表的相关记录时应该使用该完整键:
FROM
Attendance AS A
LEFT JOIN StudentCourse AS SC ON
SC.S_ID = A.S_ID AND
SC.C_ID = A.C_ID
希望这有所帮助...
推荐阅读
- objective-c - 从 Objective-C 访问 unicodeScalars
- angular - 在编辑角度表单时添加加载 div 直到数据加载
- javascript - 如何检查字符串数组的数组是否存在差异
- video - FFMPEG:将 UHD H265 转码为 SDR H264 而不会丢失颜色
- reactjs - react - material-ui单选按钮的勾选逻辑
- javascript - 如何在 div 内动态创建元素?
- mongodb - Mongodb:按自定义表达式排序
- javascript - history.push() 重定向 url 但组件不呈现(reactjs 应用程序)
- python - 上下文感知修改 - 熊猫
- linux - Apache2 没有启动,我使用的是 Ubuntu 16.04