【问题标题】:SQL Server MERGE statement and ORDER BY clauseSQL Server MERGE 语句和 ORDER BY 子句
【发布时间】: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);

【问题讨论】:

    标签: sql-server sql-order-by merge-statement


    【解决方案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 子句中过滤掉的任何行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多