0

在 SQLite 3 中,我想构建一段 SQL(或者,只要我可以使用基本的 SQLiteStudio 安装执行它),它可以从给定数据库中的所有表中读取,并列出它们的字段和它们在所有表格中出现的次数(基于它们的名称)。

例子:

第一个表:人

领域:

  1. 个人ID

第二张表:地址

领域:

  1. 个人ID

  2. 街道

运行代码后,我将创建第三个表,例如 fields_list,如下所示:

字段:/计数:

个人ID / 2

名字 / 1

姓氏 / 1

街道 / 1

任何想法?我对纯 SQL 没问题,但是这种遍历表本身的方式恐怕超出了我的能力范围……

提前致谢!

安德烈

4

1 回答 1

0

你可以用一点脚本来做到这一点。假设我的数据库结构是:

CREATE TABLE a (personID text, name text);
CREATE TABLE b (personID text, address text);

以下 shell 命令将按计数聚合列名(将 foo.sqlite 替换为您的数据库文件):

sqlite3 foo.sqlite "select name from sqlite_master where type = 'table'" | while read tableName; do sqlite3 foo.sqlite "pragma table_info($tableName)"; done | awk -F\| '{print $2}' | sort | uniq -c

给出输出:

   1 address
   1 name
   2 personID

以下是它正在做的逐步分解:

打印所有表的名称 - 每行一个

sqlite3 foo.sqlite "select name from sqlite_master where type = 'table'"

Output
a
b

读取每个表名,并执行PRAGMA table_name()打印出表模式:

while read tableName; do sqlite3 foo.sqlite "pragma table_info($tableName)"; done

Output
0|personID|text|0||0
1|name|text|0||0
0|personID|text|0||0
1|address|text|0||0

用作|分隔符并抓取第二列:

awk -F\| '{print $2}'

Output
personID
name
personID
address

对结果进行排序:

sort

Output
address
name
personID
personID

合并唯一结果,-c 显示出现的项目数。

uniq -c

Output
   1 address
   1 name
   2 personID
于 2016-12-05T01:13:21.793 回答