Bel*_*igh 2 sql-server-2008 t-sql sql-server-2008-r2
我知道通常你会有一个自动编号字段 - 但在这种情况下没有,老实说,更新哪一行并不重要,只要它只有 1。
我有一个 DDL 示例,例如一张包含请求数量的表和一张包含可用数量的表。我想@Test1.amtonhand
使用 from 的值进行更新@Test2.amtonhand
并加入,@Test1.nrs=@Test2.nrs
但只更新 1 条记录@Test1
这是如何在 SQL Server 2008 中实现的
Declare @Test1 Table
(
nrs varchar(100)
,amtrqst varchar(100)
,amtonhand varchar(100)
)
Declare @Test2 Table
(
nrs varchar(100)
,amtonhand varchar(100)
)
Insert Into @Test1 (nrs, amtrqst) Values
('abc', '10'), ('abc', '12'), ('abc', '13'), ('def', '5'), ('def', '12')
Insert Into @Test2 (nrs, amtonhand) Values
('abc', '10'), ('def', '5')
Run Code Online (Sandbox Code Playgroud)
编辑
我想要的更新结果是
@Test1 --
abc, 10, 10
abc, 12
abc, 13
def, 5, 5
def, 12
Run Code Online (Sandbox Code Playgroud)
如果您不关心哪一行被更新,您可以使用ROW_NUMBER
任意顺序:
WITH CTE AS
(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY nrs ORDER BY (SELECT NULL))
FROM @Test1
)
UPDATE a
SET a.amtonhand = b.amtonhand
FROM CTE a
INNER JOIN @Test2 b
ON a.nrs = b.nrs
WHERE a.RN = 1;
Run Code Online (Sandbox Code Playgroud)
结果是:
?????????????????????????????
? nrs ? amtrqst ? amtonhand ?
?????????????????????????????
? abc ? 10 ? 10 ?
? abc ? 12 ? NULL ?
? abc ? 13 ? NULL ?
? def ? 5 ? 5 ?
? def ? 12 ? NULL ?
?????????????????????????????
Run Code Online (Sandbox Code Playgroud)