2015-12-22 79 views
0

我有以下查詢,其中我嘗試將所有內容都放在一起,以便我只需要執行一次優化查詢(oracle 12c DBMS)。在Oracle數據庫中通過加入選擇的更新行

update PersonStatus s 
set s.status = 4 
where exists (
    select 1 from PersonStatus s1 
     inner join Person p 
     on s1.id = p.id 
    where p.details = 'california' and s1.status = 0 and s1.age in (1,2,3,4,5) 
) 

表:

Person (id, details) 
PersonStatus(id, status, age) 

其中id在PersonStatus引用ID的人。請注意,我簡化/重命名錶格僅用於演示目的。

基本上,我只是想更新匹配存在條件的行(....),但我似乎沒有得到它。

當我執行此操作時,它更新了表中的所有行,但我需要的是隻更新給定列表中具有年齡的行(1,2,3,4,5)。 這是用於Oracle 12c數據庫。

任何想法爲什麼這樣的行爲?建議表示讚賞。

===== 在MySQL中。我的以下查詢工作正常:

update PersonStatus s 
inner join Person p on s.id = p.id 
set s.status = 4; 
where p.details = 'california' and s.status = 0 and s.age in (1,2,3,4,5) 

我試圖在Oracle 12c中實現這一點。

回答

0

我想你只是想要一個相關的子查詢。換句話說,你不需要PersonStatus子查詢:

update PersonStatus s 
    set s.status = 4 
    where exists (select 1 
        from Person p 
        where s.id = p.id and 
         p.details = 'california' and 
         s.status = 0 and s.age in (1,2,3,4,5) 
       ); 

我猜測,這是你正在尋找的邏輯。

1

我認爲以下修改後的查詢應該爲你工作

update PersonStatus s 
    set s.status = 4 
where exists (select 1 
       from Person p 
       where s.id = p.id 
        and p.details = 'california' 
      ) 
    and s.status = 0 
    and s.age in (1,2,3,4,5) 
; 
+0

它的工作原理,確實如此。額外的問題:我們可以使用連接來提高效率,而不是使用select子查詢嗎? – Simo

+0

查看此[SO帖子](http://stackoverflow.com/questions/2446764/update-statement-with-inner-join-on-oracle)瞭解如何在Oracle中使用MERGE語句來連接表以更新數據。就效率而言,由於您使用的是EXISTS子句,因此可能不會那麼糟糕,您必須嘗試兩種方法並進行比較。如果你可以在這裏發佈你的比較結果會很好。 – vmachan

相關問題