2016-04-29 65 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' 
    ) 
    ;