SQLite-如何联接来自不同数据库的表?

我有一个使用 SQLite 数据库的应用程序,所有东西都按照它应该的方式工作。我现在正在添加需要第二个 SQLite 数据库的新功能,但是我很难弄清楚如何联接来自不同数据库的表。

If someone can help me out with this one, I'd really appreciate it!

编辑: 参见 这个问题中的一个例子,当您按照已接受的答案附加数据库时,您可以适应您的语言。

83121 次浏览

Well, I don't have much experience with SQLite you have to access both databases in a single query.

你可以有这样的东西:

select name from DB1.table1 as a join DB2.table2 as b where a.age = b.age;

在像 SQLServer 这样的数据库中,您可以以这种层次结构的方式访问其他数据库,这也适用于 SQLite。

我认为您可以启动一个具有多个数据库的 sqlite 实例!

如果在 Sqlite 构建中,附件已激活(应该在 大部分构建中) ,则可以使用 附件关键字将另一个数据库文件附加到当前连接。限制数据库的数量,可以附加是一个编译时间设置(SQLITE_MAX_ATTACHED) ,目前默认值为10,但这也可能因构建的不同而有所不同。全球极限是125。

attach 'database1.db' as db1;
attach 'database2.db' as db2;

您可以看到所有具有关键字的连接数据库

.databases

那么您应该能够执行以下操作。

select
*
from
db1.SomeTable a
inner join
db2.SomeTable b on b.SomeColumn = a.SomeColumn;

请注意,数据库名称 maintemp是为主数据库和数据库保留的,用于保存临时表和其他临时数据对象。这两个数据库名称对于每个数据库连接都存在,不应该用于附件”。

下面是一个 C # 示例来完成这个问题

/// <summary>
/// attachSQL = attach 'C:\\WOI\\Daily SQL\\Attak.sqlite' as db1 */
/// path = "Path of the sqlite database file
/// sqlQuery  = @"Select A.SNo,A.MsgDate,A.ErrName,B.SNo as BSNo,B.Err as ErrAtB from Table1 as A
///                    inner join db1.Labamba as B on
///                    A.ErrName = B.Err";
/// </summary>
/// <param name="attachSQL"></param>
/// <param name="sqlQuery"></param>
public static DataTable GetDataTableFrom2DBFiles(string attachSQL, string sqlQuery)
{
try
{
string conArtistName = "data source=" + path + ";";
using (SQLiteConnection singleConnectionFor2DBFiles = new SQLiteConnection(conArtistName))
{
singleConnectionFor2DBFiles.Open();
using (SQLiteCommand AttachCommand = new SQLiteCommand(attachSQL, singleConnectionFor2DBFiles))
{
AttachCommand.ExecuteNonQuery();
using (SQLiteCommand SelectQueryCommand = new SQLiteCommand(sqlQuery, singleConnectionFor2DBFiles))
{
using (DataTable dt = new DataTable())
{
using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(SelectQueryCommand))
{
adapter.AcceptChangesDuringFill = true;
adapter.Fill(dt);
return dt;
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Use Process Exception method An error occurred");
return null;
}


}