2017-09-27 33 views
0

是的,SQL UPDATE可以與一起使用,作爲SELECT的子查詢。需要在子查詢中訂購的SQL更新

人在那裏誰擁有了以下問題的解決方法:

不時程序在TABLE1生成數據錯誤(我們是不是該代碼的所有者,但需要使用程序...)

我們使用觸發器協議對AUDIT表的所有更改。

我們可以找到以下選擇錯誤的情況(和正確的舊值):

select top 1 audit.OldValue 
    from TABLE1 
    left join AUDIT on AUDIT.Table1_ID = TABLE1.ID 
where <...some conditions...> 
    order by AUDIT.UpdateDate desc 

由於有記錄的一些變化,我們只需要修改(order by updatedate,然後採取TOP 1

我們將糾正數據錯誤,如果我們可以使用UPDATE命令狀

Update TABLE1 
set VALUE = 
(select top 1 audit.OldValue 
    from TABLE1 
    left join AUDIT on AUDIT.Table1_ID = TABLE1.ID 
    where <...some conditions...> 
    order by AUDIT.UpdateDate desc) 
where TABLE1.ID = AUDIT.Table1_ID 

但是:你不能使用order by在子查詢中...

+0

您使用哪個dbms? – jarlh

+0

[如何更新來自其他表的頂部1的列]的可能的副本(https://stackoverflow.com/questions/6952277/how-to-update-the-column-coming-from-top-1-of -other-table) – Prisoner

+0

我們使用MS-SQL-Server 2012 –

回答

0

我改變了UPDATE -command到:

Update TABLE1 
set VALUE = CORRECT_VALUES.OldValue 
from 
(select top 1 audit.OldValue OldValue, AUDIT.Table1_ID Table1_ID 
    from TABLE1 
    left join AUDIT on AUDIT.Table1_ID = TABLE1.ID 
    where <...some conditions...> 
    order by AUDIT.UpdateDate desc) as CORRECT_VALUES 
where TABLE1.ID = CORRECT_VALUES.Table1_ID 

這工作正常。

而且因爲這隻會改變1項(由於TOP 1)我們必須使用一個循環:

Declare @i int = 0 
Declare @NUMBER int = (select count(*) from 
    (select distinct AUDIT.Table1_ID 
     from TABLE1 
     left join AUDIT on AUDIT.Table1_ID = TABLE1.ID 
    where <...some conditions...> 
    )) 

while @i < @NUMBER 
BEGIN 
    SET @i = @i + 1 
    <... past the whole UPDATE command here ...> 
END 

工作正常了必須更新的所有記錄。

請注意distict,因爲相同ID可能會有很多變化,您只需要更改記錄。

0

代替top 1使用ROW_NUMBER(),只保留行的地方是=1

類似:

Update t set Value = A.OldValue 
FROM Table1 t 
inner join (
    select ROW_NUMBER() OVER (PARTITION BY UserCode ORDER BY MEASUREDATE DESC) N, Id Table1_ID, * 
    from AUDIT 
) a on a.Table1_ID = t.ID 
where <...some conditions...> 
AND (a.N=1) 

您將應用的所有更新的所有記錄,只有一個更新(注意< .. .some條件...>)