2014-02-21 35 views
0

我有一個表,我想用上一行中另一列中的值更新列。使用UPDATE插入SELECT語句返回的值

我想做這樣的事情。

UPDATE myTable as b SET prev=(SELECT top 1 myField FROM myTable 
WHERE rowID<b.rowID ORDER By rowID Desc) 

任何想法?

注意:我正在使用Access/SQL服務器。我收到一個錯誤'操作必須使用可更新的查詢'。

注2:從How do I UPDATE from a SELECT in SQL Server?解決方案不起作用。

+0

運行上面,當你得到一個錯誤? – aglassman

+0

請註明DBMS - SQL Server,MySQL,Oracle等。 – ErikE

+0

看起來像Microsoft SQL Server,還有其他什麼使用'TOP'? –

回答

-1

而是頂,使用MAX()

UPDATE myTable as b 
SET prev = (
    SELECT max(rowID) 
    FROM myTable 
    WHERE rowID < b.rowID) 
+0

不做OP想要的東西 - 他想要來自前一行的一些field_value,而不是前一行的rowID。 –

+0

是的,我解釋錯了。在我的防守中,最佳做法是存儲ID,然後您可以回到桌面並獲取所需的任何維度/屬性,而不是實際存儲ID。 – toddsonofodin

0

您可以使用LAG的組合實現這一目標()解析函數來計算的上一個行和更新(在這裏,我的價值中號用MERGE語句):

MERGE INTO mytable as target using (
    select 
    t.id, 
    lag(field1) over (partition by null order by id) new_prev_field 
    from mytable t 
) as src (id, new_prev_field) 
on (target.id = src.id) 
when matched 
then update 
    set prev_field1 = src.new_prev_field; 

SQL Fiddle