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

Posted

技术标签:

【中文标题】SQLite - 你如何连接来自不同数据库的表?【英文标题】:SQLite - How do you join tables from different databases? 【发布时间】:2011-10-13 01:47:45 【问题描述】:

我有一个使用 SQLite 数据库的应用程序,并且一切正常。我现在正在添加需要第二个 SQLite 数据库的新功能,但我很难弄清楚如何连接来自不同数据库的表。

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

编辑:请参阅this question,以了解当您按照已接受的答案中所述附加数据库时可以适应您的语言的示例。

【问题讨论】:

数据库是什么样的?有没有可以用来加入它们的通用列?每个列的列是否相同,以便您可以使用联合? sqlite.org/syntaxdiagrams.html 是的,有些列可以使用 USING 关键字连接,因为它们的名称相同。我的问题不是我不知道如何加入,因为我的程序已经经常在同一个数据库中的表上执行此操作,而是我似乎无法找到如何链接两个数据库,因此一个数据可以从另一个数据库中使用(例如加入) 示例:第一个数据库有一个名为“schedule”的表,其中包含日期列、团队 ID 和车道编号等列。第二个数据库有一个表格,记录用户为他们的团队比赛输入的分数。所以这个表也有一个日期和一个teamID。我想通过这两列加入他们,以了解每支球队应该在哪条车道上比赛。为了其他目的,还必须连接其他表,但您可以从这个示例中了解我需要什么。 【参考方案1】:

如果在您的 Sqlite 构建中 ATTACH 是 activated(它应该在 大多数 构建中),您可以使用 ATTACH 关键字将另一个数据库文件附加到当前连接。 limit on the number of db's that can be attached 是一个编译时间设置 (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]数据库名称 maintemp 保留给主数据库和数据库以保存临时表和其他临时数据对象。这两个数据库名称都存在于每个数据库连接中,不应该用于附件”。

【讨论】:

用户 StanleyD 指出,直到他在文件名周围加上 '(单引号)后,这对他不起作用。我也发现了。 attach语句后可以选择不同的主库吗?【参考方案2】:

这是一个完成此问题的 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;
    


【讨论】:

这行得通 - 谢谢。但顺便说一句,我认为我们不需要这么多嵌套的 using 语句。【参考方案3】:

好吧,我对 SQLite 没有太多经验,你必须在一个查询中访问两个数据库。

你可以有类似的东西:

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

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

我认为您可以使用超过 1 个数据库启动一个 sqlite 实例!

【讨论】:

是的,我看到了 SQL Server 的文档,但找不到 SQLite 的等效查询。该查询的问题是我使用驱动程序管理器来创建连接,因此我有两个指向数据库文件的连接对象,但是由于某种原因,执行 conn1.table 似乎不起作用。

以上是关于SQLite - 你如何连接来自不同数据库的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何内部连接来自不同数据上下文的表? [复制]

如何将不同数据上下文的表进行内部连接?[重复]

如何使用来自两个不同表SQLite的元素更新/删除

在 SQLite 中连接来自不同表的两个字段

如何连接来自两个不同 PDO 对象的表?

Mysqli 连接来自 2 个不同数据库的表