【问题标题】:Difference between two update SQL statements? [duplicate]两个更新 SQL 语句之间的区别? [复制]
【发布时间】: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 “需要帮助理解为什么第二个不起作用”,因为语法不正确。您应该对此类事情使用子查询。但在这种特殊情况下,这将是矫枉过正,坚持你的第一种方法。

标签: sql database oracle database-design oracle-sqldeveloper


【解决方案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 他们。而您的查询实际上只这样做了。因此它出错了!
  • 最后,如果满意,请接受这个作为答案:)
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2021-12-21
  • 2017-01-31
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多