通常、自動番号フィールドがあることは知っていますが、この場合はありません。正直なところ、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 ║
╚═════╩═════════╩═══════════╝