2016-04-29 12 views
0

SQLでの経験が少しあり、SQLPlus/Oracleの次のコードが出てきました。私はちょっとあなたがこのコードを使って更新する理由を混乱させる。 テーブルの例では、なぜそれは単に以下のように更新することはできません、任意の助けを事前に Where句のサブクエリを使用したSQL更新

おかげ

update e 
    set grade = 'HD' 
where result >= 80 
    and grade != 'HD' 
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') ; 

COL3列COL1、COL2とTABLE1です!

EDIT:テーブル名に

+0

注意を:サブクエリ**はスカラーサブクエリでなければならないか、 '=(サブクエリ)'は実際には 'IN(サブクエリ)'であるべきです – joop

+0

これは最初に投稿したものとはまったく異なります。書き直しは3つしかなかった。 – mathguy

+0

申し訳ありません。結果と等級の列を見るのとは対照的に、なぜこの方法が提案されているのか明確になりますか? –

答えて

0

を変更することなく、実際のコードを追加し、条件サブクエリ(select stu_no from e where result > 80 and grade !='HD'一つだけの結果を返さなければならない、またはそれ以外の場合はクエリがエラーを返します、それは本当に行うことができることを考えますサブクエリなし。

多分それは意図されています:条件に一致する単一のレコードがある場合にのみ更新します。しかし、それはそのような簡単なチェックのためのかなりのオーバーヘッドです。

これが行われた状況を守ってください。コンピュータサイエンスのいくつかのことは非常に難しいことがあります。

+0

上記のクエリをコンテキストの実際のテーブル名で変更しました。それが役立つかもしれません。なぜ、上記のコードは1つのレコードだけを更新するのでしょうか? 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' 
    ) 
    ; 
関連する問題