我有一个数据库表:
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接受存储过程中的语法,但是当它执行时会生成错误:
表格含糊不清
我做错了什么?
每列中的数据已经保证是唯一的,Col1
和Col2
的每个组合都是唯一的。
答案 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]