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


100

我有一个使用SQLite数据库的应用程序,并且一切正常运行。我现在正在添加需要第二个SQLite数据库的新功能,但是我很难确定如何从不同的数据库联接表。

如果有人可以帮助我解决这个问题,我将不胜感激!

编辑:请参见此问题的示例案例,当您按照已接受的答案所述连接数据库时,可以适应您的语言。


数据库是什么样的?是否有任何可用于联接它们的公共列?每个列是否相同,以便您可以使用联合?sqlite.org/syntaxdiagrams.html
亚历克斯

是的,有些列可以使用USING关键字进行连接,因为它们的名称相同。我的问题不是我不知道如何联接,因为我的程序已经在同一个数据库中的表上频繁执行此操作,而是我似乎找不到如何链接两个数据库,因此一个人的数据可用于另一个数据库(例如加入))
Adam Smith,

示例:第一个数据库有一个名为“时间表”的表,除其他列外,它还包含一个日期列,一个团队ID和一个车道号。第二个数据库具有一个表,该表跟踪用户为其团队游戏输入的得分。因此,该表还具有日期和teamID。我想使用这两列加入他们的队伍,以了解每支球队应该在哪个车道上比赛。为了其他目的,还必须结合其他表,但是您可以从此示例中了解我的需求。
亚当·斯密

Answers:


126

如果连网激活你的SQLite版本(应该是在大多数版本),你可以附加其他数据库文件使用当前连接ATTACH关键字。可以附加的数据库数量限制是编译时间设置(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;

请注意,“[t]把数据库名main,并temp保留主数据库和数据库来保存临时表和其它临时数据对象。这两个数据库的名称存在每个数据库连接,并且不应该用于连接”。


2
用户StanleyD指出,直到他'在文件名两边加上(单引号)后,该命令才对他有用。我发现一样。
bkribbs

4

这是一个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;
    }

}

1

好吧,我在SQLite方面没有太多经验,您必须在单个查询中访问两个数据库。

你可以有类似的东西:

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

在类似SQLServer的数据库中,您可以按这种分层方式访问其他数据库,这也适用于SQLite。

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


是的,我看到了SQL Server的文档,但是找不到SQLite的等效查询。该查询的问题在于我使用drivermanager创建了连接,因此我有两个指向数据库文件的连接对象,但是由于某种原因,执行conn1.table似乎无法正常工作。
亚当·斯密
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.