2017-08-02 28 views
0

我必須根據條件更新選定的行。 下面的查詢返回幾行:更新表格時使用返回的選擇行

select 
     b.CRDATTIM, 
     b.RECORDCD, 
     b.CRNODE, 
     b.UNITCD, 
     b.WRKTYPE 


    from W67U999S a 
    join W03U999S b 
     on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE 
    where a.PCRDATTIM = '2017-07-20-04.22.20.893340' 
    and a.PRECORDCD = 'F' 
    and a.PCRNODE = '01' 
    and b.WRKTYPE = 'CALLER' 
    and b.UNITCD='CS2XAA'; 

現在我已經更新列這已經是基於以下where條件

W67u999s.ccrdattim=returned select row.crdattim 

我有以上select查詢中使用W67u999spcrdattim嘗試使用以下查詢,但它並不工作。:

update W67u999s set pcrdattim='2017-07-31-07.40.42.355440' from W67U999S as a inner join W03U999S as b on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE 
    where a.PCRDATTIM = '2017-07-20-04.22.20.893340' 
    and a.PRECORDCD = 'F' 
    and a.PCRNODE = '01' 
    and b.WRKTYPE = 'CALLER' 
    and b.UNITCD='CS2XAA' 
    and a.ccrdattim=crdattim and b.crecordcd='T'; 

有什麼想法?

+0

你能在SELECT語句創建一個視圖,並在更新使用它?或者只是使用:更新表(內部SQL)設置,然後加入條件。 –

+0

我的觀點會使查詢進一步複雜化。我們不能不使用任何視圖嗎?我的意思是通過使用'joins' –

回答

0

下面的查詢工作對我來說(exists做了魔這裏):

update W67U999S a set pcrdattim= '2017-07-31-07.40.42.355440' 
where exists 
(select 
     b.CRDATTIM, 
     b.RECORDCD, 
     b.CRNODE, 
     b.UNITCD, 
     b.WRKTYPE 
    from W03U999S b 

    where a.PCRDATTIM = '2017-07-20-04.22.20.893340' 
    and a.CCRDATTIM = b.CRDATTIM 
    and a.CRECORDCD = b.RECORDCD 
    and a.CCRNODE = b.CRNODE 
    and a.PRECORDCD = 'F' 
    and a.PCRNODE = '01' 
    and b.WRKTYPE = 'CALLER' 
    and b.UNITCD='CS2XAA' and a.crecordcd='T'); 
-1

這可能幫助:

update W67U999S from 
(
    select 
      b.CRDATTIM, 
      b.RECORDCD, 
      b.CRNODE, 
      b.UNITCD, 
      b.WRKTYPE 


     from W67U999S a 
     join W03U999S b 
      on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE 
     where a.PCRDATTIM = '2017-07-20-04.22.20.893340' 
     and a.PRECORDCD = 'F' 
     and a.PCRNODE = '01' 
     and b.WRKTYPE = 'CALLER' 
     and b.UNITCD='CS2XAA' 
) X 
set W67u999s.ccrdattim= X.crdattim 
where 
    W67U999S.CCRDATTIM = X.CRDATTIM 
    and W67U999S.CRECORDCD = X.RECORDCD 
    and W67U999S.CCRNODE = X.CRNODE 
+1

Oracle不支持這種語法。儘管你可以使用'MERGE'實現類似的功能。 –

1

MERGE是你在這種情況下的朋友。 A MERGE允許您只使用JOIN(就像您已經擁有的那樣),並將其用作表格中UPDATE的基礎。

MERGE需要從USING子句到要更新的表的連接。在大多數使用情況下,使用主鍵很好。由於您沒有提供完整的表格結構,請參閱此示例並根據您的需求進行調整。

merge into W67U999S t 
using (

    select 
     a.primary_key, b.CRDATTIM -- change this line 

     /* 
      b.CRDATTIM, 
      b.RECORDCD, 
      b.CRNODE, 
      b.UNITCD, 
      b.WRKTYPE 
     */ 

     from W67U999S a 
     join W03U999S b 
      on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE 
     where a.PCRDATTIM = '2017-07-20-04.22.20.893340' 
     and a.PRECORDCD = 'F' 
     and a.PCRNODE = '01' 
     and b.WRKTYPE = 'CALLER' 
     and b.UNITCD='CS2XAA' 
) u 
on (t.primary_key = u.primary_key) 
when matched then update set t.pcrdattim = u.CRDATTIM 
+0

有用的解決方案+1 –

相關問題