如何进行复杂的T-SQL更新查询?

时间:2009-06-04 20:32:25

标签: tsql

我有一个数据库表:

Col1 | Col2 | Col3
------------------
  1  |   2  |  -
  2  |   3  |  -
  3  |   4  |  -
  4  |   5  |  -

第1列和第2列有数据但3为空。

我想要实现的是将Col3设置为前一行的Col1值(从技术上讲,Col1值等于Col2值的前一行),得到这个:

Col1 | Col2 | Col3
------------------
  1  |   2  |  -
  2  |   3  |  1
  3  |   4  |  2
  4  |   5  |  3

我正在努力克服更新查询以实现这一目标。我一直在尝试这样的事情:

UPDATE Table
SET [cur].Col3 = [prev].Col1
FROM Table [cur], Table [prev]
WHERE [cur].Col1 = [prev].Col2

但这似乎对我不起作用。 SQL Server接受存储过程中的语法,但是当它执行时会生成错误:

  

表格含糊不清

我做错了什么?


注意:

每列中的数据已经保证是唯一的,Col1Col2的每个组合都是唯一的。

4 个答案:

答案 0 :(得分:2)

UPDATE [cur] -- <<====== change here
SET [cur].Col3 = [prev].Col1
FROM Table [cur], Table [prev]
WHERE [cur].Col1 = [prev].Col2

答案 1 :(得分:1)

UPDATE [cur] 
SET [cur].Col3 = [prev].Col1
FROM Table [cur]
JOIN Table [prev] on [cur].Col1 = [prev].Col2

请尝试开始使用连接语法而不是旧式语法。您将遇到更少的问题,维护起来更容易,并且没有意外的交叉连接。左边连接将正常工作,因为他们现在没有使用* =语法。此外,您将获得1992年标准的最新信息。

答案 2 :(得分:1)

尝试:

declare @yourTable table (col1 int, col2 int, col3 int)
INSERT INTO @YourTable values (1,2,NULL)
INSERT INTO @YourTable values (2,3,NULL)
INSERT INTO @YourTable values (3,4,NULL)
INSERT INTO @YourTable values (4,5,NULL)

UPDATE cur
   SET cur.Col3 = prev.Col1
   FROM @YourTable           cur
       INNER JOIN @YourTable prev ON cur.col1=prev.col2

select * from @YourTable

输出:

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(3 row(s) affected)
col1        col2        col3
----------- ----------- -----------
1           2           NULL
2           3           1
3           4           2
4           5           3

(4 row(s) affected)

答案 3 :(得分:0)

将第一行更改为

UPDATE [cur]