SQLITE3:在多个表

时间:2018-01-05 12:36:19

标签: sql sqlite

我想分析在某些条件下多个表中出现的代码。但是我不认为数据库架构非常适合这项任务,但也许我不知道的事情可以帮助我。这是一个简化的架构:

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.data1”不等于0时,“13kos”表中某个ID(假设为127)(在任何koX列中)的次数发生。我会这样做数据库名为ko.db,来自bash命令行,如:

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

答案 0 :(得分:1)

  

如何在不写出每个表的情况下组合所有525 ko表   命名

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

  2. 使用以下内容查询 sqlite_master 表: -

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

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

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

相关问题