代码之家  ›  专栏  ›  技术社区  ›  ojunk

SQLITE3:跨多个表查找ID

  •  0
  • ojunk  · 技术社区  · 8 年前

    我想对在特定条件下多个表中出现的代码进行分析。然而,我不认为数据库模式非常适合这项任务,但也许有一些我不知道的东西可以帮助我。下面是一个简化的模式:

    CREATE TABLE "batchDescription" (
            id INTEGER NOT NULL,
            name TEXT NOT NULL UNIQUE,
            PRIMARY KEY (id)
    );
    
    CREATE TABLE "simulationDetails" (
            id INTEGER NOT NULL,
            ko_index_id INTEGER NOT NULL,
            batch_description_id INTEGER NOT NULL,
            data1 REAL NOT NULL,
            data2 INTEGER NOT NULL,
            PRIMARY KEY (id)
            FOREIGN KEY(ko_index_id) REFERENCES "koIndex" (id)
            FOREIGN KEY(batch_description_id) REFERENCES "batchDescription" (id)
    );
    
    CREATE TABLE "koIndex" (
            id INTEGER NOT NULL,
            number_of_kos INTEGER NOT NULL,
            PRIMARY KEY (id)
    );
    
    CREATE TABLE "1kos" (
            ko_index_id INTEGER NOT NULL,
            ko1 INTEGER NOT NULL,
            PRIMARY KEY (ko_index_id)
            FOREIGN KEY(ko_index_id) REFERENCES "koIndex" (id)
    );
    
    CREATE TABLE "2kos" (
            ko_index_id INTEGER NOT NULL,
            ko1 INTEGER NOT NULL,
            ko2 INTEGER NOT NULL,
            PRIMARY KEY (ko_index_id)
            FOREIGN KEY(ko_index_id) REFERENCES "koIndex" (id)
    );
    
    CREATE TABLE "3kos" (
            ko_index_id INTEGER NOT NULL,
            ko1 INTEGER NOT NULL,
            ko2 INTEGER NOT NULL,
            ko3 INTEGER NOT NULL,
            PRIMARY KEY (ko_index_id)
            FOREIGN KEY(ko_index_id) REFERENCES "koIndex" (id)
    );
    

    这将上升到表“525kos”,其中包含ko1到ko525-ko1到ko525是作为此处未显示的表中主键的ID。我想分析在特定条件下特定ID出现的频率。下面是一个简单的示例:

    我想计算一下simulationDetails时“13kos”表中某个ID(比如127)(在任何koX列中)出现的次数。数据1不等于0。我会在一个叫做ko的数据库上这样做。来自bash命令行的db,如:

    for ko_idx in {1..13}; do sqlite3 ko.db "select count(ko${ko_idx}) from '13kos' where ko${ko_idx} = 127 and ko_index_id in (select ko_index_id from simulationDetails where data1 != 0);"; done
    

    这已经是缓慢和低效的,但与我想做的相比很简单。如果我想对所有“Xkos”表中所有可能列中的所有ID进行分析,并将它们与data1等于或不等于零的位置进行比较,该怎么办?

    有没有人能告诉我一个更好的方法来做这件事,或者模式设计对这种分析不是很好,我不得不放弃?

    编辑:我想我应该添加一些额外的细节以避免混淆。我怀疑实现我想要的愿望的一个好方法是以某种方式将所有“Xkos”表合并到一个临时表中,然后从该表中搜索特定ID。我如何组合所有525个ko表而不写出每个表名?

    1 回复  |  直到 8 年前
        1
  •  1
  •   MikeT    8 年前

    我如何组合所有525个ko表而不写出每个表 名称

    1. 创建一个列数与允许空值的最大表(合并到其中的表)相同的表。

    2. 查询 sqlite\u主机 表使用类似以下内容:-

      SELECT * from sqlite_master WHERE name LIKE '%kos%' AND type = 'table'

    3. 循环提取的表名,构建 INSERT SELECT 对于将从表中插入行到1中创建的表中的每个表。

    4. 完成后,将相应地填充在1中创建的表。