簡體   English   中英

Oracle SQL - 更新集字段為值Case當另一個字段等於某個值時

[英]Oracle SQL - Update Set field to value Case When another field equals something

有沒有辦法讓這個更新只在另一個字段等於某個值的條件下發生? 即。 如果inv.nl_sch_chg = 1我只想將inv.schedule_finish設置為不同的值。

這是SET inv.schedule_finish = CASE WHEN inv.nl_sch_change = 1 THEN ... END CASE; 或者有更好的方法來實現這一目標嗎?

這是我目前的發言:

UPDATE INV_INVESTMENTS inv
SET inv.schedule_finish = (SELECT TRUNC(odf.nl_rev_enddate) + 1/(24*60*60)
                           FROM ODF_CA_CHANGE odf
                           JOIN RIM_RISKS_AND_ISSUES rim ON rim.ID = odf.ID
                           WHERE rim.ID = ${gel_objectInstanceId})
WHERE inv.ID = (SELECT rim.PK_ID
                FROM RIM_RISKS_AND_ISSUES rim
                JOIN INV_INVESTMENTS inv ON inv.ID = rim.PK_ID
                JOIN ODF_CA_CHANGE odf ON odf.ID = rim.ID
                WHERE odf.ID = ${gel_objectInstanceId});

謝天謝地

您只需將條件添加到where子句:

UPDATE INV_INVESTMENTS inv
SET inv.schedule_finish = (SELECT TRUNC(odf.nl_rev_enddate) + 1/(24*60*60)
                           FROM ODF_CA_CHANGE odf
                           JOIN RIM_RISKS_AND_ISSUES rim ON rim.ID = odf.ID
                           WHERE rim.ID = ${gel_objectInstanceId})
WHERE inv.ID = (SELECT rim.PK_ID
                FROM RIM_RISKS_AND_ISSUES rim
                JOIN INV_INVESTMENTS inv ON inv.ID = rim.PK_ID
                JOIN ODF_CA_CHANGE odf ON odf.ID = rim.ID
                WHERE odf.ID = ${gel_objectInstanceId})
AND inv.nl_sch_change = 1

這樣,只有inv.nl_sch_change = 1的行才會更新,否則無論數據是否發生更改,都將更新所有行。 所以這應該稍快一些。

以下是我對您的查詢的觀察:

  1. UPDATE語句的SET和WHERE子句中使用的“=”表示在這兩個地方使用的子查詢只返回一個值。
  2. SET和WHERE子句中的SELECT查詢幾乎相似,只是INV_INVESTMENTS上有一個額外的連接(同一個表正在更新)。

現在,來更好地處理這個問題。 您可以通過兩種方式處理此問題:

  1. 使用單個查詢(來自INV_INVESTMENTS的SELECT ROWID)連接所有表,並使其成為顯式游標。 使用BULK COLLECT INTO和FORALL UPDATE語句使用ROWID更新INV_INVESTMENTS表。 您必須啟用SAVE_EXCEPTION子句並相應地處理異常。
  2. 使用UPDATE語句,不包括“JOIN INV_INVESTMENTS inv ON inv.ID = rim.PK_ID”。 我們可以從“UPDATE INV_INVESTMENTS inv”訪問“inv”,並在第二個子查詢的現有WHERE子句中添加“inv.ID = rim.PK_ID”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM