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


100

SQLiteデータベースを使用するアプリケーションがあり、すべてが正常に機能します。現在、2番目のSQLiteデータベースを必要とする新しい機能を追加しているところですが、さまざまなデータベースのテーブルを結合する方法を理解するのに苦労しています。

誰かがこれを手伝ってくれるなら、私は本当に感謝しています!

編集:承認された回答で述べられているように、データベースを接続するときに自分の言語に適応できるケースの例については、この質問を参照してください。


データベースはどのようなものですか?それらを結合するために使用できる一般的な列はありますか?ユニオンを使用できるように、それぞれの列は同じですか?sqlite.org/syntaxdiagrams.html
Alex R.

はい、同じ名前が付けられているUSINGキーワードを使用して結合可能な列があります。私の問題は、プログラムが同じデータベース内のテーブルですでにこれを頻繁に実行しているので、参加方法がわからないことではなく、一方のデータを他方から使用できるように両方のデータベースをリンクする方法を見つけることができないようです(たとえば、結合のように)
アダム・スミス、

例:最初のデータベースには「スケジュール」と呼ばれるテーブルがあり、他の列の中でも、日付列、チームID、およびレーン番号が含まれています。2番目のデータベースには、チームのゲームでユーザーが入力したスコアを追跡するテーブルがあります。したがって、このテーブルには日付とteamIDもあります。これらの2つの列を使用して参加し、すべてのチームがどのレーンでプレーすることになっているのかを知りたいです。他の目的で結合する必要がある他のテーブルがありますが、この例から必要なものを理解できます。
アダム・スミス

回答:


126

SqliteのビルドでATTACHアクティブになっている場合(ほとんどのビルドで有効)、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;

なお、「[t]は、彼のデータベース名maintempプライマリ・データベースと一時テーブルやその他の一時的なデータオブジェクトを保持するデータベースのために予約されている。これらのデータベース名の両方が、すべてのデータベース接続のために存在し、取り付けのために使用すべきではありません」。


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サーバーのドキュメントを見ましたが、SQLiteに相当するクエリが見つかりませんでした。このクエリの問題は、ドライバーマネージャーを使用して接続を作成することです。そのため、データベースファイルを指す2つの接続オブジェクトがありますが、何らかの理由でconn1.tableを実行しても機能しないようです。
アダム・スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.