更新联接查询不更新表中的记录

时间:2019-05-09 23:08:07

标签: c# sql sql-server

在我的出勤表中,我想使用S_ID桥表中的C_IDStudentCourse更新记录,但不更新。

https://imgur.com/a/7ZBItur

当我使用它来选择并显示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

enter image description here

实际上有两个表:

  • 学生(S_ID(主键))
  • 课程(C_ID(主键))
  • StudentCourse((S_ID,C_ID(外键))桥表)
  • 和带有(S_ID,C_ID(外键))的出勤表

我正在做的是通过联接表并选择datagridviewS_IDS_NameC_IDPre_AbsAttendance上显示数据表列)中所有这些表的列。

现在,我想在单击按钮时将datagridview中显示的信息插入到出勤表中。

我已经使用datagrdview.rows[i].cell[2]属性通过对出席表的简单插入查询完成了此操作。

我想知道是否还有更好的主意,以便可以使用JOIN而不是将datagridview属性与for循环一起使用。

目前,我的出勤表为空,而StudentCourseStudentCourse表中都填充了数据。

我要显示的是S_ID表中的记录(C_IDstudentCourse)和Pre_Abs表中的记录(Attendance),当我提交出席我希望它针对出勤表中的每个Pre_absS_ID存储C_ID记录。

enter image description here

我认为我无法进一步解释。

2 个答案:

答案 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子句中)的顺序相同。如果字段/值顺序不匹配,则数据会混合在一起(如果查询不会由于数据类型错误而失败)!

最后但并非最不重要的一点:如果AttendanceStudentCourse表共享相同的组合键(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

希望这会有所帮助...