Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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合并命令_Sql_Sql Server 2008_Merge - Fatal编程技术网

一个表上的SQL合并命令

一个表上的SQL合并命令,sql,sql-server-2008,merge,Sql,Sql Server 2008,Merge,我正试图忘掉MERGEsql语句。我想要实现的是: 在CSScolorOrders表中插入新值,但如果具有colID和ordID的记录已存在,则更新corQuantity列 这就是我的结局: MERGE INTO CSScolorOrders AS TARGET USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE ON (SOURCE.colID = 1) WHEN MATCHED THEN UPDATE SET c

我正试图忘掉
MERGE
sql语句。我想要实现的是:

CSScolorOrders
表中插入新值,但如果具有
colID
ordID
的记录已存在,则更新
corQuantity

这就是我的结局:

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
ON (SOURCE.colID = 1) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);
不幸的是,它没有引发任何异常,所以我不知道它为什么不起作用。

如前所述,您将看到合并与听起来完全一样。取两个表并搜索加入它们的值,我们称之为“X”。如果X是匹配项,则对该记录执行更新。如果不存在,则使用选定的值对目标表执行插入

就你而言,我不完全确定你是否会加入

  (  ON (SOURCE.colID = 1)   )
这是正确的。我很确定这是必须的

on(Source.colID = Target.colID)
因此,完整的声明应该是:

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
on(Source.colID = Target.colID)
WHEN MATCHED THEN 
  UPDATE SET corQuantity = 1 
WHEN NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);
但我还没有对此进行测试,并且不能100%确定您的表列是什么,以及您到底要加入什么。但是我提供的链接应该为您指出正确的方向

希望这有帮助

MERGE CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
ON (SOURCE.colID = TARGET.colID) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);

这是经过测试的。它不会引用该表两次。我试图在复制密钥更新时复制MySQL。

若要更新或插入表,无论该表是否包含记录,您可以按如下方式合并:

  • 确保使用子句返回一个条目
  • ON子句中表示匹配条件
在您的情况下(下面的示例在Oracle上测试):

大多数数据库都有一个虚拟表,允许任意选择(上面,我使用DUAL),但如果我们只使用您问题中提到的表,您可以替换

SELECT 'OneEntry' FROM DUAL


@Sebas是sql2k8。这是特定于T-SQL的语法。我明白了,很抱歉,我当时以为我可以帮上忙,但不幸的是没有。rgds。
MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT 'OneEntry' FROM DUAL) AS SOURCE
ON (colID = 1 and ordID = 3) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);
SELECT 'OneEntry' FROM DUAL
SELECT COUNT(*) FROM CSScolorOrders