查询数据库中整个表的特定列
Query specific column on entire tables in a database
我有一个包含多个表的 SQLite 数据库,其中一些(不是全部)有一个名为 'attachment' 的特定列。我想知道是否有一个查询从所有具有此列的表中获取 'attachment' 列的值。我可以从数据库中获取所有表的名称,然后分别查询所有表。但我认为必须有一个查询才能做到这一点。
您可以在每个 table 中获取每个 attachment 字段的值,使用连接上的 GetSchema 方法定义此字段以查找所有相关的 tables 然后你可以使用 sql stament UNION 在一个命令中提取所有附件值。
这应该是仅使用标准 ADO.NET 命令和方法的代码:
using(SQLiteConnection cnn = new SQLiteConnection(@"Data Source=E:\temp\mydb.db;Version=3"))
{
cnn.Open();
// We want all columns with the name as "attachment"
DataTable dt = cnn.GetSchema("COLUMNS", new string[] {null, null, null, "attachment"});
// Now we prepare the single commands that extract the attachments value
// from every row returned by the previous query.
// The TABLE_NAME field contains the name of the relevant table
var s = dt.AsEnumerable().Select(x => $"SELECT attachment FROM [{x.Field<string>("TABLE_NAME")}]");
// We join together the single commands separating them with the UNION statement
string command = string.Join(" UNION ", s);
// Finally we can construct and execute a command loading a datatable
// with all the attachements values from every table.
SQLiteCommand cmd = new SQLiteCommand(command, cnn);
dt = new DataTable();
dt.Load(cmd.ExecuteReader());
// Here you can work on the single field in the _dt_ table
....
}
请注意,UNION 将为每个附件提取不同的值。这意味着如果您有两个同名附件,它将只列出一次。如果您想保留所有内容,请将 UNION 更改为 UNION ALL(语句前后有空格)
你可以使用SQLite代码将sql SELECT
语句作为字符串获取并执行它以获取数据库所有表中列attachment
的所有值:
SELECT GROUP_CONCAT('SELECT ' || pti.name || ' FROM ' || sm.name, ' UNION ALL ') sql
FROM sqlite_master sm CROSS JOIN pragma_table_info(sm.name) pti
WHERE sm.type = 'table' AND pti.name = 'attachment';
上面的查询 returns 只有 1 行和 1 列的结果集别名为 sql
,其值是这样的字符串:
SELECT attachment FROM table1
UNION ALL
SELECT attachment FROM table2
UNION ALL
SELECT attachment FROM table4
您可以根据需要在函数 GROUP_CONCAT()
中将 UNION ALL
更改为 UNION
。
查看简化版 demo.
我有一个包含多个表的 SQLite 数据库,其中一些(不是全部)有一个名为 'attachment' 的特定列。我想知道是否有一个查询从所有具有此列的表中获取 'attachment' 列的值。我可以从数据库中获取所有表的名称,然后分别查询所有表。但我认为必须有一个查询才能做到这一点。
您可以在每个 table 中获取每个 attachment 字段的值,使用连接上的 GetSchema 方法定义此字段以查找所有相关的 tables 然后你可以使用 sql stament UNION 在一个命令中提取所有附件值。
这应该是仅使用标准 ADO.NET 命令和方法的代码:
using(SQLiteConnection cnn = new SQLiteConnection(@"Data Source=E:\temp\mydb.db;Version=3"))
{
cnn.Open();
// We want all columns with the name as "attachment"
DataTable dt = cnn.GetSchema("COLUMNS", new string[] {null, null, null, "attachment"});
// Now we prepare the single commands that extract the attachments value
// from every row returned by the previous query.
// The TABLE_NAME field contains the name of the relevant table
var s = dt.AsEnumerable().Select(x => $"SELECT attachment FROM [{x.Field<string>("TABLE_NAME")}]");
// We join together the single commands separating them with the UNION statement
string command = string.Join(" UNION ", s);
// Finally we can construct and execute a command loading a datatable
// with all the attachements values from every table.
SQLiteCommand cmd = new SQLiteCommand(command, cnn);
dt = new DataTable();
dt.Load(cmd.ExecuteReader());
// Here you can work on the single field in the _dt_ table
....
}
请注意,UNION 将为每个附件提取不同的值。这意味着如果您有两个同名附件,它将只列出一次。如果您想保留所有内容,请将 UNION 更改为 UNION ALL(语句前后有空格)
你可以使用SQLite代码将sql SELECT
语句作为字符串获取并执行它以获取数据库所有表中列attachment
的所有值:
SELECT GROUP_CONCAT('SELECT ' || pti.name || ' FROM ' || sm.name, ' UNION ALL ') sql
FROM sqlite_master sm CROSS JOIN pragma_table_info(sm.name) pti
WHERE sm.type = 'table' AND pti.name = 'attachment';
上面的查询 returns 只有 1 行和 1 列的结果集别名为 sql
,其值是这样的字符串:
SELECT attachment FROM table1
UNION ALL
SELECT attachment FROM table2
UNION ALL
SELECT attachment FROM table4
您可以根据需要在函数 GROUP_CONCAT()
中将 UNION ALL
更改为 UNION
。
查看简化版 demo.