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 子句的主要内容,如果未能解决你的问题,请参考以下文章
SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)
在 SQL Server 2008 R2 的 MERGE 语句中更新插入的记录
SQL Server - 使用 Merge 语句实现表数据之间的对比同步
转载SQL Server - 使用 Merge 语句实现表数据之间的对比同步