web-dev-qa-db-ja.com

SQL Serverの上位1行を更新する

通常、自動番号フィールドがあることは知っていますが、この場合はありません。正直なところ、1だけであればどの行が更新されるかは問題ではありません。

要求された数量を含むそのような1つのテーブルと、利用可能な数量を含む1つのテーブルのようなサンプルDDLがあります。 @Test1.amtonhandの値で@Test2.amtonhandを更新し、@[email protected]に参加したいが、@Test1の1件のレコードのみを更新したい

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')

[〜#〜]編集[〜#〜]
更新からの私の望ましい結果は

@Test1 --
abc, 10, 10
abc, 12
abc, 13
def, 5, 5
def, 12

どの行が更新されるかを気にしない場合は、任意の順序で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;

結果は次のとおりです。

╔═════╦═════════╦═══════════╗
║ nrs ║ amtrqst ║ amtonhand ║
╠═════╬═════════╬═══════════╣
║ abc ║      10 ║ 10        ║
║ abc ║      12 ║ NULL      ║
║ abc ║      13 ║ NULL      ║
║ def ║       5 ║ 5         ║
║ def ║      12 ║ NULL      ║
╚═════╩═════════╩═══════════╝
4
Lamak