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 语句实现表数据之间的对比同步

SQL Server2008中的MERGE SQL语句中的MERGE的全称是什麼?代表什麼意思? 有没有

Sql server的Merge语句,源表中如果有重复数据会导致执行报错