【发布时间】:2011-09-03 20:00:10
【问题描述】:
使用 Oracle(或 DB2、HSQLDB),我可以这样表达:
MERGE INTO [target_table]
USING (SELECT 1 FROM dual)
ON [target_table.id = 5]
WHEN MATCHED THEN UPDATE ...
WHEN NOT MATCHED THEN INSERT ...
这只是检查target_table 中是否已经存在id = 5 的记录。如果有,则记录更新,如果没有,则插入。这个和MySQL的比较简洁大体相同
INSERT INTO [target_table] ...
ON DUPLICATE KEY UPDATE ...
如何在 SQL Server 中做到这一点?根据文档,[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>
}
http://msdn.microsoft.com/de-de/library/bb510625.aspx
显然,SQL Server 没有DUAL 表,但也不允许使用SELECT 语句。 [table_source] 可以写什么?
注意:我发现我可以创建一个虚拟视图
CREATE VIEW dummy (one) AS SELECT 1;
并将其作为[table_source] 提供。但我想省略 DDL 语句只是为了能够执行这个 MERGE 语句
【问题讨论】:
标签: sql sql-server merge