在合并语句中使用连接

Ste*_*a D 23 sql t-sql merge

问题

表格1:

| KeyColumn | DataColumn1 | DataColumn2|  
   01         0.1          0.2
   02         0.13         0.41
Run Code Online (Sandbox Code Playgroud)

表2:

| anotherKey | DataColumn1 | DataColumn2|      
   A1          .15          1.2
   A2          .25          23.1
Run Code Online (Sandbox Code Playgroud)

表3:

|KeyColumn| anotherKey |       
  01        A1
  02        A1
Run Code Online (Sandbox Code Playgroud)

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

因此table1可以更新x行数,如上面的数据所示.如果我想更新A1,则应更新01和02行

(因此,对于datacolumn1,table1中的值将为0.15,对于01和02键,dat1olumn2中的值为1.2)

到目前为止我尝试了什么:

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;
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 这是允许的吗?要在using语句中使用select?我在第1行遇到语法错误
  2. 有没有更好的方法来解决这个问题?我是否比这更复杂?
  3. 我究竟做错了什么?

和错误:

消息102,级别15,状态1,行1'a'附近的语法不正确.消息102,级别15,状态1,行12'd'附近的语法不正确.

Mik*_*son 34

您的查询将给出错误

Msg 8156, Level 16, State 1, Line 59
The column 'AnotherKey' was specified multiple times for 'tmpTable'.
Run Code Online (Sandbox Code Playgroud)

那是因为你正在使用*的使用条款中,并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;
Run Code Online (Sandbox Code Playgroud)

更新

发布实际错误总是有帮助的.

Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'a'. Msg 102, Level 15, State 1, Line 12 Incorrect syntax near 'd'.
Run Code Online (Sandbox Code Playgroud)

看起来你在SQL Server 2005上.可以从SQL Server 2008中获得合并.

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