2014-02-21 34 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