更新 SQL Server 中的前 1 行

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)

Lam*_*mak 5

如果您不关心哪一行被更新,您可以使用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)