28

问题

表格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 行都应该更新

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

问题:

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

和错误:

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

4

1 回答 1

44

您的查询将给出错误

消息 8156,级别 16,状态 1,第 59 行 为“tmpTable”多次指定了“AnotherKey”列。

那是因为您*在 using 子句中使用并且是andAnotherKey的一部分。 指定您需要的列。由于您在子句中使用,因此在那里使用外部连接也没有用。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;

更新

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

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

看起来您在 SQL Server 2005 上。合并可从SQL Server 2008获得。

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

于 2012-10-15T20:59:39.997 回答