2017-06-13 91 views
0

我正在玩vb.net应用程序中的SQLite数据库。数据库应该存储许多变量的时间序列数据。 现在我想建立2个表的数据库如下:带有未知外键的SQLite查询

  1. 表varNames:

    CREATE TABLE IF NOT EXISTS varNames(id INTEGER PRIMARY KEY, varName TEXT UNIQUE); 
    

它看起来像这样:

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

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

    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 & "'); 
    

    由于用户不知道variabel ID,变量(在NAMEvariable)的只有名字,我用..WHERE(SELECT ...语句看来。这样真的会减慢性能。该时间序列有高达50K点。

    有没有更好的方式来查询值只能通过它的名字来解决特定的变量?

    回答

    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