web-dev-qa-db-ja.com

SQLite-異なるデータベースのテーブルをどのように結合しますか?

SQLiteデータベースを使用するアプリケーションがあり、すべてが正常に機能します。現在、2番目のSQLiteデータベースを必要とする新しい機能を追加するプロセスを進めていますが、異なるデータベースのテーブルを結合する方法を見つけるのに苦労しています。

誰かがこれで私を助けてくれれば、本当に感謝しています!

編集: この質問 を参照してください。受け入れられた回答に記載されているように、データベースを接続するときに言語に適応できる例があります。

91
Adam Smith

Sqliteのビルドで [〜#〜] attach [〜#〜]activated の場合(mostbuilds)、 [〜#〜] attach [〜#〜] キーワードを使用して、現在の接続に別のデータベースファイルを添付できます。 アタッチできるdbの数の制限 はコンパイル時の設定( 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;

「[[]データベース名mainおよびtempは、プライマリデータベースおよび一時テーブルおよびその他の一時データオブジェクトを保持するデータベース用に予約されています。これらのデータベース名は、すべてのデータベース接続に存在します添付には使用しないでください」。

113
Brian Gideon

この質問を完了する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;
    }

}
3
Dr.Sai

さて、SQLiteの経験はあまりありません。1回のクエリで両方のデータベースにアクセスする必要があります。

あなたは次のようなものを持つことができます:

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

SQLServerのようなデータベースでは、この階層形式で他のデータベースにアクセスできますが、これはSQLiteでも機能するはずです。

複数のデータベースでsqliteのインスタンスを開始できると思います!

2
Yugal Jindle