在Where子句中使用子查询的SQL更新

时间:2016-04-29 14:13:36

标签: sql oracle

我在SQL方面有一些经验,并且遇到了以下SQLPlus / Oracle代码。我对你为何使用这段代码进行更新感到有些困惑。 表示例是table1,其列为col1,col2,col3

update e
    set grade='HD'
    where stu_no=(
          select stu_no
          from e
          where  result >80 and grade !='HD')
      and unit_code=(
          select unit_code
          from e
          where result >80 and and grade !='HD' ) ;

为什么它不能像以下那样更新,

update e
   set grade = 'HD'
 where result >= 80 
   and grade != 'HD'

提前感谢您的帮助!

编辑:添加实际代码而不更改表名

2 个答案:

答案 0 :(得分:0)

鉴于条件子查询(select stu_no from e where result > 80 and grade !='HD'必须只返回一个结果,否则查询将返回错误,那么它确实可以在没有子查询的情况下完成。

可能是这样的:只有在有一条符合条件的记录时才会更新。但这对于如此简单的检查来说是相当大的开销。

请注意制作本文的背景。计算机科学中的一些东西可能非常棘手。

答案 1 :(得分:0)

如果我理解你的问题,你想更新IFF另一条记录exists,使用相同的{col1,col2}和(col2&gt; 0 AND col3&lt;&gt;'XYZ'):< / p>

UPDATE table1 t1
  SET col3 = 'XYZ'
WHERE EXISTS (
    SELECT * 
    from table1 ex
    WHERE ex.col1 = t1.col1 AND ex.col2 = t1.col2
    AND col2 > 0 and col3 <> 'XYZ'
    )
    ;