在所有数据库上使用单个查询

时间:2017-06-15 12:39:44

标签: database sqlite sqlitestudio

我需要同时对大量数据库(准确地说是50个)执行一个简单的查询

SELECT * FROM table1 WHERE column1 NOT IN(SELECT column1 FROM table2)

我正在使用:
SQLite Studio 3.1.0
和.sqlite数据库

SQLite不允许使用DECLARE,因此我无法使用变量存储所有数据库名称

数据库名称结构:
commonpart_CUSTOM


更新:
我意识到我没有解释我的疑问。我想从table1中选择column1所有内容,其中column1table2-Database1 -Table1 -Column1 -Column2 -Column3 -Column4 -Table2 -Column1 -Column2 -Column3 -Table3 -Column1 -Column2 -Column3 -Database2 -Table1 -Column1 -Column2 -Column3 -Column4 -Table2 -Column1 -Column2 -Column3 -Table3 -Column1 -Column2 -Column3 中包含的值不匹配

我必须对50个数据库进行此操作,这些数据库具有相同的结构但具有不同的数据,而不是一次在一个数据库上执行查询。我希望能够在我的所有数据库上执行它,只有一个表可以合并所有结果,但也可以声明它来自哪个数据库,但不必自己编写所有数据库名称。

Column1
来自table1

Column1
包含来自table2的{​​{1}}中声明的数据类型,但是包含在1M亿行中,因此它是重复的

e.g.
row1 AAA
row2 AAA
row3 BBB
row4 FLM
来自Column1

table2
包含声明的数据类型
e.g. Types: AAA, BBB, CCC, FFF

预期产出:

╔════╦══════════════╦════════════╦════════════╦════════════╦════════════╗
║    ║   Database   ║   Column1  ║   Column2  ║   Column3  ║  Column4   ║
╠════╬══════════════╬════════════╬════════════╬════════════╬════════════╣
║  1 ║ Database1    ║    FLM     ║Data        ║Data        ║Data        ║
║  2 ║ Database2    ║     -      ║Data        ║Data        ║Data        ║
║  3 ║ Database3    ║    NULL    ║Data        ║Data        ║Data        ║
║  4 ║ Database4    ║    NULL    ║Data        ║Data        ║Data        ║
╚════╩══════════════╩════════════╩════════════╩════════════╩════════════╝
来自Column1

Expected Output包含与Column1table2中定义的数据类型不匹配的所有数据类型,Database列包含数据库的名称输出来自哪个,其他列包含发现不匹配值的行的所有其他列


由于第4行Column1的{​​{1}}包含table1 Column1中不存在的FLM,因此需要输出

我只需要一种方法来告诉我的查询在多个数据库上执行,而无需自己编写数据库的名称,就像循环一样。

注意:我只能提供通用数据,因为它与工作有关,抱歉。

2 个答案:

答案 0 :(得分:0)

很难给出一个不知道你正在使用的架构的具体答案,但你可以尝试使用一个视图:

https://www.tutorialspoint.com/sqlite/sqlite_views.htm

答案 1 :(得分:0)

访问不同数据库中数据的唯一方法是ATTACH。 默认limit for attached databases为10,因此您必须编译自己的SQLite库版本才能增加此限制。 完成后,您可以在所有50个表中使用compound query

ATTACH '...' as db1;
ATTACH '...' as db2;
...

SELECT 'Database1' AS DB, * FROM db1.Table1 WHERE Column1 NOT IN (SELECT Column1 FROM db1.Table2)
UNION ALL
SELECT 'Database2'      , * FROM db2.Table1 WHERE Column1 NOT IN (SELECT Column1 FROM db2.Table2)
UNION ALL
...

SQLite是一个嵌入式数据库,旨在从“真正的”编程语言中使用。因此,无法从SQL本身动态构造SQL语句。相反,您必须在程序中构建查询。