我必须执行 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/