sql – 在merge语句中使用join

前端之家收集整理的这篇文章主要介绍了sql – 在merge语句中使用join前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题

表格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列.

所以table1可以更新X行数,如上面的数据所示.如果要更新A1,则应更新01和02行

(因此,对于datacolumn1,表1中的值为0.15,对于01和02键,datacolumn2的值为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;

问题:

这是否允许?要在using语句中使用select?我在第1行出现语法错误
有没有更好的办法呢?我做这个比它要复杂吗?
>我做错了什么?

错误

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

解决方法

您的查询将给出错误
Msg 8156,Level 16,State 1,Line 59
The column 'AnotherKey' was specified multiple times for 'tmpTable'.

那是因为你在using子句中使用*,AnotherKey是table2和table3的一部分.
指定您需要的列.因为在onclause中使用keycolumn,所以没有任何外部连接.

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,Line 1 Incorrect Syntax near 'a'. Msg 102,Line 12 Incorrect Syntax near 'd'.

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

您可以使用select @@版本检查您的sql Server版本.

猜你在找的MsSQL相关文章