在我的出勤表中,我想使用S_ID
桥表中的C_ID
和StudentCourse
更新记录,但不更新。
当我使用它来选择并显示StudentCourse
表中的2列和Attendance
表中的1列时它起作用,但是当我使用它来更新出勤表时却不起作用现在是空的
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
实际上有两个表:
我正在做的是通过联接表并选择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
记录。
我认为我无法进一步解释。
答案 0 :(得分:0)
您已声明表出勤的别名。因此,您应该在列名之前使用别名引用,作为与其他表中相同的列名。你可以试试这个吗?
UPDATE a
SET a.S_ID = sc.S_ID,
a.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
我也怀疑您的状况,因为您是更新表出勤,但要过滤表StudentCourse上的记录。使用错误的筛选器可能会导致更新表Attendance中的所有行。请小心。
答案 1 :(得分:0)
嗯。我不明白为什么您的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
...您尝试从表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
希望这会有所帮助...