SQLite - คุณเข้าร่วมตารางจากฐานข้อมูลต่างๆได้อย่างไร?


101

ฉันมีแอปพลิเคชันที่ใช้ฐานข้อมูล SQLite และทุกอย่างทำงานได้ตามที่ควร ตอนนี้ฉันอยู่ในขั้นตอนการเพิ่มฟังก์ชันใหม่ที่ต้องใช้ฐานข้อมูล SQLite ตัวที่สอง แต่ฉันมีปัญหาในการหาวิธีเข้าร่วมตารางจากฐานข้อมูลต่างๆ

หากมีใครสามารถช่วยฉันได้ฉันจะขอบคุณจริงๆ!

แก้ไข:ดูคำถามนี้สำหรับกรณีตัวอย่างที่คุณสามารถปรับให้เข้ากับภาษาของคุณได้เมื่อคุณแนบฐานข้อมูลตามที่กล่าวไว้ในคำตอบที่ยอมรับ


ฐานข้อมูลเป็นอย่างไร มีคอลัมน์ทั่วไปที่สามารถใช้เพื่อเข้าร่วมได้หรือไม่? คอลัมน์ของแต่ละคอลัมน์เหมือนกันไหมที่คุณสามารถใช้สหภาพได้ sqlite.org/syntaxdiagrams.html
Alex R.

ใช่มีคอลัมน์ที่สามารถเข้าร่วมได้โดยใช้คำหลัก USING เนื่องจากมีชื่อเหมือนกัน ปัญหาของฉันไม่ใช่ว่าฉันไม่รู้ว่าจะเข้าร่วมได้อย่างไรเนื่องจากโปรแกรมของฉันทำสิ่งนี้บ่อยๆบนตารางในฐานข้อมูลเดียวกันดูเหมือนว่าฉันไม่สามารถหาวิธีเชื่อมโยงฐานข้อมูลทั้งสองได้ดังนั้นข้อมูลหนึ่งจึงสามารถใช้งานได้จากที่อื่น ( เช่นการเข้าร่วม)
Adam Smith

ตัวอย่าง: ฐานข้อมูลแรกมีตารางชื่อ "ตารางเวลา" ประกอบด้วยคอลัมน์อื่น ๆ คอลัมน์วันที่รหัสทีมและหมายเลขช่องทาง ฐานข้อมูลที่สองมีตารางที่คอยติดตามคะแนนที่ผู้ใช้ป้อนสำหรับเกมของทีม ตารางนี้จึงมีวันที่และ teamID ด้วย ฉันต้องการเข้าร่วมกับพวกเขาโดยใช้สองคอลัมน์นี้เพื่อรู้ว่าทุกทีมควรเล่นในเลนไหน มีตารางอื่นที่จะต้องเข้าร่วมเพื่อจุดประสงค์อื่น แต่คุณสามารถเข้าใจสิ่งที่ฉันต้องการได้จากตัวอย่างนี้
Adam Smith

คำตอบ:


130

หากATTACHจะเปิดใช้งานในการสร้างของคุณ 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 ที่มีฐานข้อมูลมากกว่า 1 ฐานข้อมูล!


ใช่ฉันเห็นเอกสารสำหรับเซิร์ฟเวอร์ SQL แต่ไม่พบแบบสอบถามที่เทียบเท่าสำหรับ SQLite ปัญหาของแบบสอบถามนั้นคือฉันใช้โปรแกรมควบคุมในการสร้างการเชื่อมต่อดังนั้นฉันจึงมีวัตถุเชื่อมต่อสองชิ้นที่ชี้ไปที่ไฟล์ฐานข้อมูล แต่การทำ conn1.table ดูเหมือนจะไม่ทำงานด้วยเหตุผลบางประการ
Adam Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.