2016-09-08 58 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

一個進程正在更新此表,所以保留了操作的原子性是沒有必要的。

我知道我可以使用兩個SQL查詢來做到這一點,但有沒有辦法在單個查詢中做到這一點?

+0

因此,它是同一個表或不一樣呢? –

+0

@PaulSpiegel它是同一張表 –

+0

你能做'where id ='someid'並且存在(select * from mytable where 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一個選項:

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

使用子查詢繞過您收到錯誤。其他方法包括outer joinnull檢查或使用not in - 取決於數據。

0

試試這個:

UPDATE mytable SET val = 'someval' 
WHERE id = 'someid' AND col <> 'val2' 
相關問題