我正在try 创建一个INSERTUPDATE语句,这取决于SELECT语句的结果.

目前,我有一个不起作用的声明:

UPDATE Inventory 
SET CQuantity = CQuantity + 1 
WHERE CBarcode = '00029218' 
  AND COALESCE(COUNT(SELECT CQuantity 
                     FROM Inventory 
                     WHERE CBarcode = '00029218'), 0) > 1;

根据SQL语句,如果条形码是指定值并且在Inventory表中找到了现有行,则应该更新Inventory表中的数量.不过,这并不管用.

如果在Inventory表中找到现有行,我希望数量为UPDATE,否则,如果条形码不存在,则它将INSERT新行.

非常感谢.

推荐答案

这是一个标准的UpSert.你的逻辑应该是这样的.

DECLARE @barcode varchar(30) = '00029218';

SET XACT_ABORT, NOCOUNT ON;
BEGIN TRAN;

UPDATE Inventory WITH (UPDLOCK, HOLDLOCK)
SET CQuantity += 1
WHERE CBarcode = @barcode;

IF @@ROWCOUNT = 0
    INSERT Inventory (CBarcode, CQuantity)
    VALUES (@barcode, 1);

COMMIT;

读数为this article,注意以下几点:

  • 您需要一个事务来确保一致性.
  • 您需要添加UPDLOCKHOLDLOCK/SERIALIZABLE个提示以确保正确锁定.
  • 你不需要先用SELECT元来判断,这很浪费.只要做UPDATE,如果@@ROWCOUNT是0,那么做INSERT.
  • 如果后者更有可能,你可以在UPDATEINSERT之间互换.
  • 如果可以 Select ,请不要在SQL Server中使用MERGE,因为它充满了错误.

Sql相关问答推荐

如何在case语句中使用条件来计算成对变量

Group By子句返回太多行

BigQuery`喜欢ANY‘和`不喜欢ANY’

SQL查询:合并2个表

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

有没有办法在Postgres中存储带有时区的时间戳,而不将其转换为UTC

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

在SQL中,筛选其他列中只有一个值的ID

用VB.NET在Dapper中实现MS Access数据库顺序透视

SQL:使用年/月/日分区查询某个时间段的数据

从另一个没有公共键的表中获取值来加入

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

如何查询自引用 comments 表以查找带有回复的 comments ,并按最新回复排序?

如何从一张表中获取值在至少三行相同的记录

创建定时器以更新Gridview

try 将多行折叠为单个结果

我如何编写一个遍历数组数组并将所有值连接成一个字符串的 postgres 函数

如何跨行合并以删除 SQL 中的空值?

当计数为 0 时显示行

SQL Group By 然后映射出是否存在值