SQL Server MERGE 语句和 ORDER BY 子句
Posted
技术标签:
【中文标题】SQL Server MERGE 语句和 ORDER BY 子句【英文标题】:SQL Server MERGE statement and ORDER BY clause 【发布时间】:2012-03-05 12:41:28 【问题描述】:我想编写一个 MERGE 语句,通过使用 ORDER BY 子句从大表中挑选 TOP 10 行并将其更新为列值之一。 MERGE 语句允许我选择 TOP 10 行,但我无法将 ORDER BY 子句放在任何地方。
MERGE TOP(10) StudentAllocation AS SA
USING (SELECT @sub_id AS subId) AS TSA ON SA.sub_id = TSA.subId
WHEN MATCHED THEN
UPDATE SET SA.exam_batch = 1);
【问题讨论】:
【参考方案1】:您可以将表表达式用作MERGE
的源和目标。
WITH SA AS
(
SELECT TOP(10) sub_id,
exam_batch
FROM StudentAllocation
ORDER BY sub_id
)
MERGE SA
USING (SELECT @sub_id AS subId) AS TSA ON SA.sub_id = TSA.subId
WHEN MATCHED THEN
UPDATE SET SA.exam_batch = 1;
虽然使用起来可能更简单
WITH SA AS
(
SELECT TOP(10) sub_id,
exam_batch
FROM StudentAllocation
ORDER BY sub_id
)
UPDATE SA
SET exam_batch = 1
WHERE sub_id = @sub_id;
【讨论】:
在这个特定场景中,您的解决方案是正确的。不过要记住的一件事是,在MERGE
上指定的TOP
子句在WHEN MATCHED\NOT MATCHED
语句中的其他WHERE
子句过滤掉任何行之后执行。如果用户在其WHEN MATCHED
子句中有任何其他过滤器,MERGE TOP(X)
将始终影响 10 行(除非有少于 10 行可能要更新)。您的解决方案只会影响 10 行,减去在 WHEN MATCHED
子句中过滤掉的任何行。以上是关于SQL Server MERGE 语句和 ORDER BY 子句的主要内容,如果未能解决你的问题,请参考以下文章