SQLite - Làm cách nào để bạn nối các bảng từ các cơ sở dữ liệu khác nhau?


100

Tôi có một ứng dụng sử dụng cơ sở dữ liệu SQLite và mọi thứ hoạt động theo cách mà nó cần. Bây giờ tôi đang trong quá trình thêm các chức năng mới yêu cầu cơ sở dữ liệu SQLite thứ hai, nhưng tôi đang gặp khó khăn trong việc tìm cách nối các bảng từ các cơ sở dữ liệu khác nhau.

Nếu ai đó có thể giúp tôi giải quyết vấn đề này, tôi thực sự rất cảm kích!

Chỉnh sửa: Xem câu hỏi này để biết ví dụ về trường hợp bạn có thể thích ứng với ngôn ngữ của mình khi đính kèm cơ sở dữ liệu như đã đề cập trong câu trả lời được chấp nhận.


Cơ sở dữ liệu như thế nào? Có bất kỳ cột chung nào có thể được sử dụng để nối chúng không? Các cột của mỗi cột có giống nhau để bạn có thể sử dụng kết hợp không? sqlite.org/syntaxdiagrams.html
Alex R.

Có, có các cột có thể nối bằng từ khóa USING vì chúng được đặt tên giống nhau. Vấn đề của tôi không phải là tôi không biết cách tham gia vì chương trình của tôi đã thực hiện điều này thường xuyên trên các bảng trong cùng một cơ sở dữ liệu, mà là tôi dường như không thể tìm cách liên kết cả hai cơ sở dữ liệu để dữ liệu của người này có thể sử dụng được từ cơ sở kia ( như tham gia chẳng hạn)
Adam Smith

Ví dụ: cơ sở dữ liệu đầu tiên có một bảng được gọi là "lịch trình", trong số các cột khác, nó chứa một cột ngày tháng, một ID đội và một số làn đường. Cơ sở dữ liệu thứ hai có một bảng theo dõi điểm số do người dùng nhập cho trò chơi đội của họ. Vì vậy, bảng này cũng có ngày tháng và mã đội. Tôi muốn tham gia với họ bằng cách sử dụng hai cột đó để biết mỗi đội phải chơi ở đường nào. Có những bảng khác sẽ phải được nối cho các mục đích khác, nhưng bạn có thể hiểu những gì tôi cần từ ví dụ này.
Adam Smith

Câu trả lời:


126

Nếu ATTACH được kích hoạt trong bản dựng Sqlite của bạn (nó phải có trong hầu hết các bản dựng), bạn có thể đính kèm tệp cơ sở dữ liệu khác vào kết nối hiện tại bằng từ khóa ATTACH . Các giới hạn về số lượng của db có thể được gắn một thiết lập thời gian biên dịch ( SQLITE_MAX_ATTACHED ), hiện mặc định là 10, nhưng điều này quá có thể thay đổi bằng cách xây dựng mà bạn có. Giới hạn toàn cầu là 125.

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

Bạn có thể xem tất cả các cơ sở dữ liệu được kết nối với từ khóa

.databases

Sau đó, bạn sẽ có thể làm như sau.

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

Lưu ý rằng "[t] he database đặt tên maintempđược dành riêng cho cơ sở dữ liệu chính và cơ sở dữ liệu để chứa các bảng tạm thời và các đối tượng dữ liệu tạm thời khác. Cả hai tên cơ sở dữ liệu này đều tồn tại cho mọi kết nối cơ sở dữ liệu và không được dùng để đính kèm".


2
Người dùng StanleyD lưu ý rằng nó không hoạt động với anh ta cho đến khi anh ta đặt '(dấu ngoặc kép) xung quanh tên tệp. Tôi thấy giống nhau.
bkribbs

4

Đây là một ví dụ C # để hoàn thành Câu hỏi này

/// <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

Chà, tôi không có nhiều kinh nghiệm với SQLite, bạn phải truy cập cả hai cơ sở dữ liệu trong một truy vấn duy nhất.

Bạn có thể có một cái gì đó như:

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

Trong cơ sở dữ liệu như SQLServer, bạn có thể truy cập các cơ sở dữ liệu khác theo kiểu phân cấp này, điều này cũng sẽ hoạt động đối với SQLite.

Tôi nghĩ bạn có thể bắt đầu một phiên bản sqlite với nhiều hơn 1 cơ sở dữ liệu!


Vâng, tôi đã xem tài liệu về máy chủ SQL, nhưng không thể tìm thấy truy vấn tương đương cho SQLite. Vấn đề với truy vấn đó là tôi sử dụng trình quản lý trình điều khiển để tạo kết nối của mình, vì vậy tôi có hai đối tượng kết nối trỏ đến tệp cơ sở dữ liệu, nhưng thực hiện conn1.table dường như không hoạt động vì một số lý do.
Adam Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.