当前位置: 首页 > 面试题库 >

在合并语句中使用联接

钱德海
2023-03-14
问题内容

问题

表格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中的值对于键01和键02的datacolumn1分别为0.15和1.2(对于datacolumn2))

到目前为止我尝试过的是:

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’附近的语法不正确。


问题答案:

您的查询将给出错误

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 Server2005。可以从SQL Server 2008中进行合并。

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



 类似资料:
  • 问题内容: 我必须使用和在单个查询中。对于该SQL具有语句。 MySQL中是否支持该语句。如果支持,请提供样本。 问题答案: MySQL不支持,但是,还有其他可能的方法可以做到这一点: 插入…在重复密钥更新上 如果您在INSERT语句中指定ON DUPLICATE KEY UPDATE选项,并且新行在UNIQUE或PRIMARY KEY索引中导致重复值,则MySQL将基于新值对旧行进行更新。

  • 问题内容: 我有一个合并语句,该语句应始终更新或插入单个记录。我想记住该语句在变量中的ID。看起来像这样: 现在这不起作用,因为您不能以这种方式在输出子句中设置@int。我知道我可以创建一个模板并在输出中使用 INTO @temptable 。但是由于我 知道 它始终是一条记录,因此我希望将ID包含在INT变量中。这有可能吗?还是我被迫使用表变量。我希望我只是缺少一些语法。 问题答案: 不,您必须

  • 问题内容: 我有一个在MySQL中运行良好的查询,但是在Oracle上运行该查询时,出现以下错误: SQL错误:ORA-00933:SQL命令未正确终止 00933。00000-“ SQL命令未正确终止” 查询是: 问题答案: 该语法在Oracle中无效。你可以这样做: 或者您 可以 执行以下操作: 它取决于内联视图是否被Oracle更新( 要更新第二条语句取决于 此处 列出的一些规则 )。

  • 我在试着做一个合并语句。我试图用节点id获取节点,但合并不允许我使用'where id(node)=nodeid'。 类似于:

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助。 7年前关闭。 这行不通吗?还是我做错了?尝试了多种形式,似乎找不到关于该主题的任何可靠信息。有任何想法吗? 问题答案: 如果是一个自我陈述。这就像一个完整的声明。因此,不能在字符串左右连接之间使用它。更好的解决方案是使

  • 问题内容: 我想从一个名为Sorels的表更新一个名为的表。它们之间的链接是的等于Sorels表的。这是我对Merge语句的第一次尝试,并且我正在尝试学习语法。 运行此命令时,出现以下错误: 错误10/22/2009 1:38:51 PM 0:00:00.000 SQL Server数据库错误:关键字’ON’附近的语法不正确。46 0 添加的信息* 在建议了第一个修复程序之后,代码如下: 现在我得