【问题标题】:SQL Server MERGE statement with "DUAL" in using clauseSQL Server MERGE 语句在 using 子句中带有“DUAL”
【发布时间】: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


    【解决方案1】:

    参见MERGE——查看示例“C. Using MERGE to perform UPDATE and INSERT operations on a target table by using a derived source table”,它使用了VALUES(又名Table Value Constructor):

    MERGE INTO Target
    USING (VALUES (1))
           AS Source (Number)
    ...
    

    编码愉快。

    【讨论】:

    • 我很笨。当然,它在语法定义中说:derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 我只是没有意识到在这种情况下别名是强制性的!谢谢!
    • merge into target_table t USING(SELECT 5 id) s ON (t.id = s.id) ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2012-11-23
    相关资源
    最近更新 更多