带有未知外键的SQLite查询

时间:2017-06-13 10:56:18

标签: database vb.net sqlite

我正在使用vb.net应用程序中的SQLite数据库。数据库应该存储许多变量的时间序列数据。 现在我正在尝试使用以下两个表构建数据库:

  1. 表varNames:

    CREATE TABLE IF NOT EXISTS varNames(id INTEGER PRIMARY KEY, varName TEXT UNIQUE);
    
  2. 看起来像这样:

    ID   |  varName  
    ---------------  
    1    |  var1  
    2    |  var2  
    ...  |  ...  
    
    1. 表varValues:

      CREATE TABLE IF NOT EXISTS varValues(timestamp INTEGER, varValue FLOAT, id INTEGER, FOREIGN KEY(id) REFERENCES varNames(id) ON DELETE CASCADE);
      
    2. 看起来像这样:

      timestamp  |  varValue  |  id  
      ------------------------------  
      1          |  1.0345    |  1  
      4          |  3.5643    |  1  
      1          |  7.7866    |  2  
      3          |  4.5668    |  2  
      ...        |  ....      | ...  
      

      第一个表包含带ID的所有变量名。第二个表包含许多时间步的每个变量的值(由时间戳表示)。外键通过变量ID链接表。

      构建数据库工作正常。

      现在我想查询数据库并绘制所选变量的时间序列。为此,我使用以下语句:

      select [timestamp], [varValue] FROM varValues WHERE (SELECT id from varNames WHERE varName= '" & NAMEvariable & "');
      

      由于用户不知道变量ID,只有变量的名称(在NAME变量中)我使用..WHERE(SELECT ...语句。这似乎真的会降低性能。时间序列有高达50k点。

      有没有更好的方法来查询特定变量的值,这些变量只能通过其名称来解决?

1 个答案:

答案 0 :(得分:0)

您可能应该使用join查询,例如:

SELECT a.[timestamp], a.varValue
FROM varValues AS a, varNames AS b
WHERE b.varName = <name>
  AND a.id = b.ID

编辑:要查询多个参数,请使用以下内容:

SELECT a.[timestamp], a.varValue
FROM varValues AS a, varNames AS b
WHERE b.varName IN (<name1>, <name2>, ...)
  AND a.id = b.ID