2017-07-10 181 views
0

我有一個表ABC已以下記錄 -SQL查詢來查找重複的記錄和更新表

INVC_NUM | LINE_NUMBER | ORGANIZATION_ID | STATUS | DATE 

    0000034454  1    521     Validated 09/09/2016 

    0000034454  2    521     Validated 04/09/2016 

    0000034410  1    521     Validated 04/09/2016 

    0000034410  2    521     notValidated 04/09/2016 

    0000034410  3    521     notValidated 04/09/2016 

    0000034410  4    521     Validated 04/09/2016 

現在我需要更新表XYZ它具有以下列

INVC_NUM  | ORGANIZATION_ID | date 

0000034454 | 521    | 09/09/2016  
0000034410 | 521    | null 

每當對於特定INVC_NUM和organization_id的所有Line_number的狀態都是「ALL」驗證(狀態),那麼我們需要用sysdate更新XYZ。

只要特定INVC_NUM和organization_id的所有Line_number的狀態都不是全部驗證(狀態),那麼我們需要用NULL更新XYZ。 XYZ對每個INVC_NUM和Org_id都有唯一的記錄。

回答

1

爲了知道是否所有狀態爲INVC_NUM和的organization_ID是有效的,看你是否找到一個無效:

update xyz 
set date = 
case when not exists 
    (
    select * 
    from abc 
    where abc.invc_num = xyz.invc_num 
     and abc.organization_id = xyz.organization_id 
     and abc.status = 'notValidated' 
) then sysdate 
end; 

(省略ELSE分支默認爲null,這是我們想要的。如果您認爲它更具可讀性,請將then sysdate end更改爲then sysdate else null end。)

+0

謝謝Thorsten。我的要求有一點變化。如果我想從另一列獲取最大值(日期)並更新該日期而不是使用sysdate,那我該如何實現? – beckham

+0

我想說的是用'(從表名選擇max(datecolumnname)')替換'sysdate'。 –

1

你可以用相關的子查詢來做到這一點。它採用聚合返回一行:

update xyz 
    set date = (select (case when count(*) = 0 then sysdate end) 
       from abc 
       where abc.status = 'NotValidated' and 
         abc.invc_num = xyz.invc_num and 
         abc.organization_id = xyz.organization_id 
       ); 
+1

謝謝Gordon。我是否也需要在Where子句中使用Organization_id? – beckham

+0

@GordonLinoff,是否有任何你可以解決的世界上的SQL查詢。鞠躬到SQL的GOD。 –

+0

@beckham是的。您必須在where子句中使用Organization_id。 –