Vir*_*ide 3 sql firebird firebird2.5
我试图在 Firebird 2.5 中创建一个 SQL 语句,以便通过在记录存在时添加或简单地插入新行来更新整数数量。如果某个数量已经存在,我似乎无法找到有关添加到某个数量的具体问题的真正答案。
我能想到的 SQL 如下:
UPDATE OR INSERT INTO Pencils(Number, Location, Quantity)
VALUES('12345678/90', 'TOP', 20)
MATCHING(Number, Location);
Run Code Online (Sandbox Code Playgroud)
因此,如果有匹配的记录,我想在实际 20 数量中添加一定数量。
就像我对UPDATE声明所做的那样:
UPDATE Pencils SET Quantity = Quantity + 20 WHERE Number = '12345678/90'
Run Code Online (Sandbox Code Playgroud)
是否有可能通过UPDATE OR INSERT语句达到这样的结果,或者还有其他方法吗?. .
编辑: 与 IBExpert/Delphi 参数一起使用的查询的解决方案
MERGE INTO Pencils AS Dest
USING (SELECT CAST(:myNumb as varchar(30)) AS Number,
CAST(:myLoca as varchar(10)) AS Location,
CAST(:myQuan as integer) AS Quantity
FROM RDB$DATABASE) Src
ON (Dest.Number = Src.Number AND Dest.Location = Src.Location)
WHEN MATCHED THEN
UPDATE SET Dest.Quantity = Dest.Quantity + Src.Quantity
WHEN NOT MATCHED THEN
INSERT (Number, Location, Quantity) VALUES (Src.Number, Src.Location, Src.Quantity);
Run Code Online (Sandbox Code Playgroud)
将 Firebird 的MERGE用于复杂的 UPSERT:
MERGE INTO Pencils AS Dest
USING (SELECT '12345678/90' AS Number,
'TOP' AS Location,
20 As Quantity
FROM RDB$DATABASE) Src
ON (Dest.Number = Src.Number AND Dest.Location = Src.Location)
WHEN MATCHED THEN
UPDATE SET Dest.Quantity = Dest.Quantity + 10
WHEN NOT MATCHED THEN
INSERT (Number, Location, Quantity) VALUES (Src.Number, Src.Location, Src.Quantity);
Run Code Online (Sandbox Code Playgroud)
这里唯一的复杂性是您Quantity在 UPDATE 上动态计算。如果您只是用静态值覆盖现有记录,则可以更简洁地使用UPDATE OR INSERT。
例子:
SQL> SELECT * FROM Pencils;
NUMBER QUANTITY LOCATION
================ ============ ================
123 5 TOP
123 10 MID
SQL> MERGE INTO Pencils AS Dest
CON> USING (SELECT '123' AS Number, 'TOP' AS Location, 20 As Quantity
CON> FROM RDB$DATABASE) Src ON (Dest.Number = Src.Number AND Dest.Location = Src.Location)
CON> WHEN MATCHED THEN
CON> UPDATE SET Dest.Quantity = Dest.Quantity + 10
CON> WHEN NOT MATCHED THEN
CON> INSERT (Number, Location, Quantity) VALUES (Src.Number, Src.Location, Src.Quantity);
SQL> SELECT * FROM Pencils;
NUMBER QUANTITY LOCATION
================ ============ ================
123 15 TOP
123 10 MID
SQL> SELECT * FROM Pencils;
NUMBER QUANTITY LOCATION
================ ============ ================
123 5 TOP
123 10 MID
SQL> MERGE INTO Pencils AS Dest
CON> USING (SELECT '123' AS Number, 'TOP' AS Location, 20 As Quantity
CON> FROM RDB$DATABASE) Src ON (Dest.Number = Src.Number AND Dest.Location = Src.Location)
CON> WHEN MATCHED THEN
CON> UPDATE SET Dest.Quantity = Dest.Quantity + 10
CON> WHEN NOT MATCHED THEN
CON> INSERT (Number, Location, Quantity) VALUES (Src.Number, Src.Location, Src.Quantity);
SQL> SELECT * FROM Pencils;
NUMBER QUANTITY LOCATION
================ ============ ================
123 15 TOP
123 10 MID
123 20 BOT
Run Code Online (Sandbox Code Playgroud)