使用SQLite

时间:2017-03-24 04:34:36

标签: sql sqlite

我在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

我查看了hereherehere链接。但是,它们要么INSERT OR REPLACE一些硬编码值,要么使用一些外部编程接口来获取查询执行的状态,并执行后续步骤。

我必须坚持使用SQLite,因此UPSERTON DUPLICATE KEYMERGE等构造在这种情况下是不利的。

2 个答案:

答案 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