使用 GROUP BY 进行 SQL MERGE

标签 sql sql-server sql-server-2008

我必须执行 MERGE 语句,但在需要准备查询之前,此查询有一个包含一些字符串列和值的 group by ,因为我进行分组时,我不能包含主键。如果我无法提供主键,如何进行MERGE

这是查询

SELECT Account,
       BillDate, 
       Name,
       SUM(ChargeAmount) AS ChargeAmount, 
       SUM(ChargeTaxes) AS ChargeTaxes,       
  FROM MyTempTable
 GROUP BY Account, BillDate, Name

现在我需要从该查询开始对我的表进行MERGE,但我没有 pk。

最佳答案

您可以将 GROUP BY 子句与 MERGE 一起使用。正如文档规定:

[ WITH <common_table_expression> [,...n] ]
MERGE 
    [ TOP ( expression ) [ PERCENT ] ] 
    [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
    USING <table_source> 
    ON <merge_search_condition>
    [ WHEN MATCHED [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [...n ]
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
        THEN <merge_not_matched> ]
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [...n ]
    [ <output_clause> ]
    [ OPTION ( <query_hint> [ ,...n ] ) ]    
;

table_source 可以位于:

<table_source> ::= 
{
    table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ] 
        [ WITH ( table_hint [ [ , ]...n ] ) ] 
  | rowset_function [ [ AS ] table_alias ] 
        [ ( bulk_column_alias [ ,...n ] ) ] 
  | user_defined_function [ [ AS ] table_alias ]
  | OPENXML <openxml_clause> 
  | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 
  | <joined_table> 
  | <pivoted_table> 
  | <unpivoted_table> 
}

因此,您可以放置​​ GROUP BY 子句,就像您在问题中所做的那样:

MERGE INTO table2 AS TGT
USING
(
  SELECT Account,
       BillDate, 
       Name,
       SUM(ChargeAmount) AS ChargeAmount, 
       SUM(ChargeTaxes) AS ChargeTaxes
  FROM table1
 GROUP BY Account, BillDate, Name
) AS SRC
  ON  SRC.Account = TGT.Account AND
      SRC.Name = TGT.Name
WHEN NOT MATCHED THEN
  INSERT (Account, BillDate, Name, ChargeAmount, ChargeTaxes)
  VALUES (SRC.Account, SRC.BillDate, 
          SRC.Name, SRC.ChargeAmount, SRC.ChargeTaxes);

SQL Fiddle Demo

关于使用 GROUP BY 进行 SQL MERGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13880404/

相关文章:

mysql - Sql:选择包含一组特定项目的所有篮子

c# - 将字符串从数据库转换为 SecureString

mysql - 在实时环境中从 MySQL 迁移到 SQL Server 的最佳方法

sql-server - 如何检测和约束SQL表中行值之间的更改?

sql-server - 是否可以在不使用表变量或临时表的情况下创建内容表?

c# - 如何获取datagridview当前行列值?

mysql - SQL 查询的令人惊讶的计时统计数据

sql - Postgres替换字符串中的字符

c# - 长时间运行的查询 Web 应用程序( azure )解决方案

c# - 将数据库文件保存在不同的分区