查询数据库中整个表的特定列

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.