两个更新 SQL 语句之间的区别? [复制]

Posted

技术标签:

【中文标题】两个更新 SQL 语句之间的区别? [复制]【英文标题】:Difference between two update SQL statements? [duplicate] 【发布时间】:2014-01-05 14:39:49 【问题描述】:

我为这个愚蠢的问题道歉,但需要有人简单地解释一下有什么区别以及为什么第一个选项效果最好。

问题:我有一个表叫student,表结构如下图

Student_id   Student_name    Subject1_marks    Subject2_marks   
001           John              11                    0 
002           Barack            12                    1 
003           McCain            12                    0 

现在,我需要将 Subject1_marks 设置为 subject2_marks,其中 Subject2_marks 等于 0

我写的 SQL 是:

第一个 SQL:

update student set Subject2_marks = Subject1_marks
where Subject2_marks= 0;

第二条 SQL:

update student a set a.Subject2_marks=b.Subject1_marks from student b
where a.student_id=b.student_id
and a.Subject2_marks= 0;

对我来说,第一个 SQL 工作得很好,但第二个没有,需要帮助来理解为什么第二个没有工作。

任何简单的解释将不胜感激。

谢谢,

【问题讨论】:

:第二条sql的语法错误如下,第一条sql是正确的,这样简单的更新不需要自连接同一张表 @user3040077 “需要帮助理解为什么第二个不起作用”,因为语法不正确。您应该对此类事情使用子查询。但在这种特殊情况下,这将是矫枉过正,坚持你的第一种方法。 【参考方案1】:

您指定了 a.Subject2_marks = 0 。但错过了本专栏的另一张表。所以对于那个student_id,另一个表中的所有行都将被连接起来,即使标记不为零,该列也会再次更新n次..最后一次更新最终保持!

Student_id   Student_name    Subject1_marks    Subject2_marks   
001           John              11                    0 
001           John              13                    2 
002           Barack            12                    1 
003           McCain            12                    0 

在上面的数据001 Student_id有2个mark details,发生了什么, 左侧表有001-11-0 合格,另一侧有001-11-0,001-13-2

所以,A的1行会在这个join中更新两次,一次用mark 11,next用mark 13。无法判断顺序!

【讨论】:

感谢 Maheswaran 的回复,感谢您的宝贵时间。您能否举一个将使用或需要使用自联接的场景示例。 欢迎您!关于您的案例本身的示例。当您想要检索在Subject2_marks 中得分0student_id 的所有标记时。因为student_idSubject2_marks 都在同一个表中,所以我们必须SELF JOIN 他们。而您的查询实际上只这样做了。因此它出错了! 最后,如果满意,请接受这个作为答案:)

以上是关于两个更新 SQL 语句之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句把同一个表中的a字段中的数据复制到另一个字段b中

选择连接SQL语句中的内连接和where之间的区别[重复]

MS SQL 技巧总结--持续更新

SQL中锁表语句简单理解(针对于一个表)

Oracle SQL 更新基于两个表之间的子查询

内部联接或 WHERE 子句中的 AND 语句之间的区别