2016-04-29 73 views
0

我在SQL方面有一些经验,并且遇到了SQLPlus/Oracle的以下代码。我有点困惑你为什么要使用这段代码进行更新。 表的例子是表1的列COL1,COL2,COL3Where子句中的子查询SQL更新

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' 
提前任何帮助

谢谢!

编辑:添加实际的代码,而无需改变表名

+0

注:子查询**应该是标量子查询,否则'=(子查询)'实际上应该是'IN(子查询)' – joop

+0

这与您最初发布的内容完全不同 - 现在有四列正在播放重写只有三个。 – mathguy

+0

对不起。这是否表明为什么建议使用这种方法而不仅仅是查看结果和等级栏? –

回答

0

鉴于条件的子查询(select stu_no from e where result > 80 and grade !='HD'必须只返回一个结果,否则查询将返回一个错误,那就真的可以做到没有子查询。

也许这是为了:只有当有一条符合条件的记录时才会更新。但这对于这样一个简单的检查来说是相当的开销。

请注意其中的内容。计算机科学中的一些东西可能相当棘手。

+0

我用上下文的实际表名改变了上面的查询。可能会有所帮助。为什么上面的代码只更新一条记录?如果where子句的条件满足,子查询是否会返回多行? –

0

如果我正确理解你的问题,你要更新IFF另一个记录exists,具有相同{COL1,COL2}与(COL2> 0 AND COL3 <> 'XYZ'):

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' 
    ) 
    ;