Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在merge语句中使用join_Sql_Tsql_Merge - Fatal编程技术网

Sql 在merge语句中使用join

Sql 在merge语句中使用join,sql,tsql,merge,Sql,Tsql,Merge,问题 表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| an

问题

表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中的值对于键01和键02上的datacolumn1和datacolumn2分别为0.15和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;
问题:

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行出现语法错误
  • 有没有更好的办法?我是不是让事情变得更复杂了
  • 我做错了什么
  • 错误是:

    Msg 102,15级,状态1,第1行 “a”附近的语法不正确。 Msg 102,15级,状态1,第12行
    “d”附近的语法不正确。

    您的查询将给出错误信息

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

    这是因为您在using子句中使用了
    *
    ,而
    另一个键
    表2
    表3
    的一部分
    指定所需的列。此外,在其中使用外部联接也没有用,因为您正在
    on
    子句中使用
    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,15级,状态1,第1行“a”附近语法不正确。味精102, 级别15,状态1,第12行“d”附近语法不正确

    看起来您使用的是SQL Server 2005。合并可从中获得


    您可以使用
    select@@version

    检查SQL Server版本,为什么要使用合并?看起来这可以通过更新来完成。我不知道,我在上读了一篇文章,内容与此相同(没有外部连接),它说合并更合适。如果你能提供一个关于如何实现这一点的例子,我将永远是伟大的。如果没有匹配,我需要插入它。我在查询中还没有走那么远,因为我只是想让第一部分工作起来。这也是我选择合并的原因之一。我仍然走错方向了吗?好的,这是使用“合并”的一个很好的理由。如果缺少行,您似乎希望将行添加到
    table2
    table3
    。这在一个merge语句中是不可能的。基本上只能有一个目标表。在我的实际查询中,我没有在using子句中使用*。我将发布实际的查询,因为它看起来像我在做与您相同的事情是的,就是这样。我以为我们是在2008年:/。谢谢我也有同样的问题,但我加入和合并的条件涉及同一列。现在怎么解决呢?