Luk*_*der 4 sql sql-server merge
使用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 ...
Run Code Online (Sandbox Code Playgroud)
这只是检查是否已经有一个记录id = 5在target_table.如果有,则记录更新,如果没有,则插入.这与MySQL更简洁大致相同
INSERT INTO [target_table] ...
ON DUPLICATE KEY UPDATE ...
Run Code Online (Sandbox Code Playgroud)
我怎么能在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>
}
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/de-de/library/bb510625.aspx
显然,SQL Server没有DUAL表,但也SELECT不允许使用语句.我能放[table_source]什么?
注意:我发现我可以创建一个虚拟视图
CREATE VIEW dummy (one) AS SELECT 1;
Run Code Online (Sandbox Code Playgroud)
并提供作为[table_source].但我想省略DDL语句只是为了能够执行此MERGE语句
小智 6
见MERGE -看看例如"C.使用合并通过使用衍生源表上的目标表中执行UPDATE和插入操作",它采用VALUES(又名表值构造):
MERGE INTO Target
USING (VALUES (1))
AS Source (Number)
...
Run Code Online (Sandbox Code Playgroud)
快乐的编码.
| 归档时间: |
|
| 查看次数: |
4528 次 |
| 最近记录: |