Sql 在merge语句中使用join
问题 表1: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
| 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;
“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年:/。谢谢我也有同样的问题,但我加入和合并的条件涉及同一列。现在怎么解决呢?