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