SQLite - आप विभिन्न डेटाबेस से तालिकाओं में कैसे शामिल होते हैं?


100

मेरे पास एक एप्लिकेशन है जो एक SQLite डेटाबेस का उपयोग करता है और सब कुछ उसी तरह से काम करता है जिस तरह से इसे करना चाहिए। मैं अब नई कार्यक्षमताओं को जोड़ने की प्रक्रिया में हूं, जिसमें एक दूसरे SQLite डेटाबेस की आवश्यकता होती है, लेकिन मुझे एक कठिन समय मिल रहा है कि विभिन्न डेटाबेस से तालिकाओं को कैसे जोड़ा जाए।

अगर कोई मुझे इस एक के साथ मदद कर सकता है, तो मैं वास्तव में इसकी सराहना करूँगा!

संपादित करें: एक उदाहरण के मामले के लिए इस प्रश्न को देखें जब आप स्वीकृत उत्तर में उल्लिखित डेटाबेस संलग्न करते हैं तो आप अपनी भाषा के अनुकूल हो सकते हैं।


डेटाबेस की तरह क्या हैं? क्या कोई सामान्य स्तंभ हैं जिनका उपयोग उन्हें शामिल करने के लिए किया जा सकता है? क्या प्रत्येक के लिए स्तंभ एक जैसे हैं कि आप एक संघ का उपयोग कर सकते हैं? sqlite.org/syntaxdiagrams.html
एलेक्स आर।

हां, ऐसे कॉलम हैं जो उपयोग करने योग्य कीवर्ड का उपयोग कर रहे हैं क्योंकि उन्हें समान नाम दिया गया है। मेरी समस्या यह नहीं है कि मैं नहीं जानता कि कैसे शामिल होने के बाद से मेरा कार्यक्रम पहले से ही एक ही डेटाबेस में तालिकाओं पर अक्सर होता है, यह है कि मुझे यह पता नहीं लग सकता है कि दोनों डेटाबेस को कैसे लिंक किया जाए ताकि एक का डेटा दूसरे से उपयोग करने योग्य हो ( उदाहरण के लिए एक जुड़ाव की तरह)
एडम स्मिथ

उदाहरण: पहले डेटाबेस में "शेड्यूल" नामक एक टेबल है, इसमें अन्य कॉलम, एक डेट कॉलम, एक टीम आईडी और एक लेन नंबर शामिल है। दूसरे डेटाबेस में एक तालिका होती है जो उपयोगकर्ताओं द्वारा उनकी टीमों के खेल के लिए दर्ज किए गए अंकों पर नज़र रखती है। तो इस तालिका में एक तिथि और एक टीमआईडी भी है। मैं उन दो स्तंभों का उपयोग करके उनसे जुड़ना चाहता हूं ताकि यह पता चले कि हर टीम को किस लेन पर खेलना है। अन्य तालिकाएं हैं जिन्हें अन्य उद्देश्यों के लिए शामिल होना होगा, लेकिन आप इस विचार से प्राप्त कर सकते हैं कि मुझे इस उदाहरण से क्या चाहिए।
एडम स्मिथ

जवाबों:


126

तो संलग्न है सक्रिय SQLite के अपने निर्माण में (यह होना चाहिए में सबसे बनाता है), तो आप वर्तमान कनेक्शन का उपयोग करने के लिए एक और डेटाबेस फ़ाइल संलग्न कर सकते हैं संलग्न कीवर्ड। डाटाबेस के कि संलग्न किया जा सकता है की सीमा पर एक संकलन समय सेटिंग (है 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
उपयोगकर्ता स्टैनली ने उल्लेख किया कि 'फ़ाइल नाम के आसपास (एकल उद्धरण) डालने तक यह उसके लिए काम नहीं करता था । मुझे वही मिला।
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 के लिए भी काम करना चाहिए।

मुझे लगता है कि आप 1 से अधिक डेटाबेस के साथ साइक्लाइट का एक उदाहरण शुरू कर सकते हैं!


हाँ, मैंने SQL सर्वर के लिए प्रलेखन देखा, लेकिन SQLite के लिए समान क्वेरी नहीं मिल सकी। उस क्वेरी के साथ समस्या यह है कि मैं अपना कनेक्शन बनाने के लिए एक ड्राइवर की सेवा का उपयोग करता हूं, इसलिए मेरे पास दो कनेक्शन ऑब्जेक्ट हैं जो डेटाबेस फ़ाइलों को इंगित करते हैं, लेकिन Con1.table करना किसी कारण से काम नहीं करता है।
एडम स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.