使用加入合并声明(Using a join in a merge statement)

2019-08-01 12:15发布

问题

表格1:

| KeyColumn | DataColumn1 | DataColumn2|  
   01         0.1          0.2
   02         0.13         0.41

表2:

| anotherKey | DataColumn1 | DataColumn2|      
   A1          .15          1.2
   A2          .25          23.1

表3:

|KeyColumn| anotherKey |       
  01        A1
  02        A1

给定一个键(A1,或者A2)我需要更新表2在表1中相应的值的DataColumn1和DataColumn2列。

所以表1可以具有更新,如图上述数据行的x个。 如果我想更新A1,两者01和02行应更新

(因此在表1中的值将是datacolumn2 0.15 datacolumn1和1.2这两个键01和02)

我迄今为止尝试:

MERGE table1
USING (SELECT *
       FROM table2
       LEFT OUTER JOIN table3
           on table2.anotherKey = table3.anotherKey
       WHERE table2.anotherKey = 'A1') tmpTable
ON 
   table1.keyColumn = tmpTable.keyColumn
WHEN MATCHED THEN
       UPDATE
       SET table1.DataColumn1 = tmpTable.DataColumn1
            ,table1.DataColumn2 = tmpTable.DataColumn2;

问题:

  1. 这可以吗? 使用选择在using语句? 我在第1行得到一个语法错误
  2. 有没有更好的方法去吗? 我是不是使这个复杂得多,它必须是?
  3. 我究竟做错了什么?

和错误:

消息102,级别15,状态1,行1附近有语法错误 'A'。 消息102,级别15,状态1,行12附近有语法错误d'。

Answer 1:

你会给错误的查询

Msg 8156, Level 16, State 1, Line 59
The column 'AnotherKey' was specified multiple times for 'tmpTable'.

那是因为你正在使用*在使用条款中并AnotherKey是两者的部分table2table3
指定您需要的列。 也有是没有用的,在那里有一个外连接,因为你正在使用keycolumnon子句。

MERGE table1
USING (SELECT table3.keycolumn,
              table2.DataColumn1,
              table2.DataColumn2
       FROM table2
       INNER JOIN table3
           ON table2.anotherKey = table3.anotherKey
       WHERE table2.anotherKey = 'A1') tmpTable
ON 
   table1.keyColumn = tmpTable.keyColumn
WHEN MATCHED THEN
       UPDATE
       SET table1.DataColumn1 = tmpTable.DataColumn1
            ,table1.DataColumn2 = tmpTable.DataColumn2;

更新

发布实际的错误总是有益的。

Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'a'. Msg 102, Level 15, State 1, Line 12 Incorrect syntax near 'd'.

看起来你的SQL Server 2005年合并为avalible SQL Server 2008中 。

您可以检查您的SQL Server版本select @@version



文章来源: Using a join in a merge statement
标签: sql tsql merge