1

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

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

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

SQLite 不允许使用DECLARE,所以我不能使用变量来存储所有的数据库名称

数据库名称结构:
commonpart_CUSTOM


更新:
我意识到我没有解释我的查询。我想选择与 from中table1包含column1的值不匹配的所有内容column1table2

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

-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

Column1fromtable1
包含在Column1from中声明的数据类型,table2但在 100 万行中,因此它是重复的

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        ║
╚════╩══════════════╩════════════╩════════════╩════════════╩════════════╝

Column1fromExpected Output包含所有与Column1from中定义的数据类型不匹配的数据类型table2,该Database列包含输出来自的数据库的名称,其他列包含找到不匹配值的行的所有其他数据类型


由于Column1table1第 4 行开始包含 FLM,它不存在于其中Column1table2因此预期作为输出

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

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

4

2 回答 2

2

访问不同数据库中数据的唯一方法是附加它们。附加数据库的默认限制是 10,因此您必须编译自己的 SQLite 库版本才能增加此限制。一旦你有了它,你就可以对所有 50 个表使用复合查询:

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 语句。相反,您必须在程序中构造查询。

于 2017-06-15T20:50:29.693 回答
0

在不知道您正在使用的架构的情况下很难给出具体的答案,但您可以尝试的一件事是使用视图:

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

于 2017-06-15T12:43:22.527 回答