我在SQLite中有一个持久表(比如PermTable)。 PermTable的架构是
PermTable ( Node1 varchar(20), Node2 varchar(20), Node3 varchar(20), Frequency number, PRIMARY KEY (Node1, Node2, Node3))
我有一个类似的临时表(比如TempTable)。 TempTable与PermTable具有相同的模式。
对于这个问题,让我们假设PermTable和TempTable的以下内容 -
PermTable
Node1 | Node2 | Node3 | Frequency
_________________________________
A | B | C | 2
B | D | E | 3
不是Temptable
Node1 | Node2 | Node3 | Frequency
_________________________________
A | B | C | 6
D | E | C | 4
我想将TempTable中的值更新/复制到PermTable中,这样如果存在任何类似的条目,则会对频率求和,否则会发生普通插入。
预期输出
PermTable
Node1 | Node2 | Node3 | Frequency
_________________________________
A | B | C | 8
B | D | E | 3
D | E | C | 4
我查看了here,here或here链接。但是,它们要么INSERT OR REPLACE
一些硬编码值,要么使用一些外部编程接口来获取查询执行的状态,并执行后续步骤。
我必须坚持使用SQLite,因此UPSERT
,ON DUPLICATE KEY
,MERGE
等构造在这种情况下是不利的。
答案 0 :(得分:1)
首先,更新匹配的所有行(如果未找到匹配,则context.Routes.MapHttpRoute(
"Api_default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { area = "Api", id = RouteParameter.Optional }
);
结果为零):
ifnull
然后添加所有新行:
UPDATE PermTable
SET Frequency = Frequency +
ifnull((SELECT Frequency
FROM TempTable
WHERE (TempTable.Node1, TempTable.Node2, TempTable.Node3) =
(PermTable.Node1, PermTable.Node2, PermTable.Node3)),
0);
答案 1 :(得分:-1)
您可以使用UNION子句
解决此问题DECLARE @PermTable TABLE ( Node1 varchar(20), Node2 varchar(20), Node3 varchar(20), Frequency int)
DECLARE @TempTable TABLE ( Node1 varchar(20), Node2 varchar(20), Node3 varchar(20), Frequency int)
INSERT INTO @PermTable VALUES
('A','B','C',2),
('B','D','E',3)
INSERT INTO @TempTable VALUES
('A','B','C',6),
('D','E','C',4)
SELECT a.Node1, a.Node2, a.Node3, SUM(a.Frequency) AS Frequency
FROM (
SELECT p.Node1, p.Node2, p.Node3, p.Frequency
FROM @PermTable AS p
UNION ALL
SELECT t.Node1, t.Node2, t.Node3, t.Frequency
FROM @TempTable AS t) AS a
GROUP BY a.Node1, a.Node2, a.Node3