2016-09-08 5 views
0

特定のレコードがテーブルに存在しない場合にのみテーブルの特定のレコードを更新します。SQL:特定の種類のレコードが同じテーブルにない場合にレコードを更新します。

次のようなSQLを試しました。

update mytable 
    set val = 'someval' 
    where id = 'someid' and 
      0 = (select count(*) from mytable where col='val2'); 

このエラーは次のエラーで失敗します。

You can't specify target table 'mytable' for update in FROM clause

つだけのプロセスは、このテーブルを更新するので、操作のアトミック性を維持する必要はありません。

私は2つのSQLクエリを使ってこれを行うことができますが、これを1つのクエリで行う方法はありますか?

+0

を? –

+0

@PaulSpiegelそれは同じテーブルです –

+0

あなたは 'id = 'someid'を実行できますか?(mytableからselect * from col = 'val2')' – Jeff

答えて

2

あなたが同じテーブルを参照しているので、これを行うための最善の方法は、LEFT JOINを使用しています。

update mytable t left join 
     mytable t2 
     on t2.col = 'val2' 
    set val = 'someval' 
    where t.id = 'someid' and t2.col is null; 
+0

これはそれです...私はそれにビートする – Jeff

1

これを行うには、いくつかの方法があります。ここでnot existsでサブクエリを使用して1つのオプションです:副問合せを使用して

update mytable 
set val = 'someval' 
where id = 'someid' 
    and not exists (
    select 1 
    from (select * from mytable) t 
    where col = 'val2') 

は、あなたがされるエラーをバイパスします。他のアプローチには、とnullのチェックがあるか、またはnot inを使用しています - データのビットによって異なります。

0

このTRY:だからそれは同じテーブルまたは同じではありません

UPDATE mytable SET val = 'someval' 
WHERE id = 'someid' AND col <> 'val2' 
関連する問題