विभिन्न सर्वरों पर दो डेटाबेस में दो तालिकाओं को जोड़कर डेटा को छोड़ना


102

अलग-अलग सर्वरों पर दो अलग-अलग डेटाबेस में दो टेबल हैं, मुझे उनसे जुड़ने की जरूरत है ताकि कुछ सवाल किए जा सकें। आपके पास कौन से विकल्प हैं? मुझे क्या करना चाहिए?


जैसे अगर PRAMP आपको यहाँ लाया
Janac Meena

जवाबों:


86

आपको sp_addlinkedserverसर्वर लिंक बनाने के लिए उपयोग करना होगा । उपयोग के लिए संदर्भ प्रलेखन देखें । सर्वर लिंक स्थापित हो जाने के बाद, आप सामान्य रूप में क्वेरी का निर्माण करेंगे, बस दूसरे सर्वर के साथ डेटाबेस का नाम उपसर्ग कर रहे हैं। अर्थात:

-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
        ON tab1.ID = tab2.ID

एक बार लिंक स्थापित हो जाने के बाद, आप OPENQUERYरिमोट सर्वर पर SQL स्टेटमेंट को निष्पादित करने और केवल डेटा को आपके पास वापस स्थानांतरित करने के लिए भी उपयोग कर सकते हैं। यह थोड़ा तेज हो सकता है, और यह दूरस्थ सर्वर को आपकी क्वेरी का अनुकूलन करने देगा। यदि आप DB1उपरोक्त उदाहरण में एक अस्थायी (या इन-मेमोरी) तालिका में डेटा को कैश करते हैं , तो आप इसे एक मानक तालिका में शामिल होने की तरह ही क्वेरी कर पाएंगे। उदाहरण के लिए:

-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')

-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID

कुछ और उदाहरण देखने के लिए OPENQUERY के प्रलेखन की जाँच करें । ऊपर दिया गया उदाहरण बहुत ही विवादित है। मैं निश्चित रूप से इस विशिष्ट उदाहरण में पहली विधि का उपयोग करूंगा, लेकिन OPENQUERYयदि आप अपने डेटा को फ़िल्टर करने के लिए क्वेरी का उपयोग करते हैं तो दूसरा विकल्प कुछ समय और प्रदर्शन को बचा सकता है।


1
क्या यह php-mysql के साथ संभव है .. यदि हाँ, तो क्या आप मुझे एक तरीका सुझा सकते हैं कि मैं उस विकल्प के साथ कैसे बढ़ सकता हूं?
झानवी

1
अगर MySQL लिंक्ड सर्वर का समर्थन करता है तो मुझे कोई पता नहीं है। यह उत्तर Microsoft SQL सर्वर के लिए विशिष्ट है।
स्कॉट एंडरसन

3
अगर किसी को पोस्टग्रेक्यूएल उत्तर की तलाश है, तो यह प्रयास करें: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland


5

यदि आपके dba द्वारा लिंक किए गए सर्वर की अनुमति नहीं है, तो आप OPENROWSET का उपयोग कर सकते हैं। पुस्तकें ऑनलाइन आपको आवश्यक सिंटैक्स प्रदान करेगी।


4

एक व्यावहारिक उद्यम के दृष्टिकोण से, सबसे अच्छा अभ्यास अपने डेटाबेस में डेटाबेस तालिका की एक स्पष्ट प्रतिलिपि बनाने के लिए है, और उसके बाद बस एक कार्य / खरीद है इसे डेल्टा के हर घंटे के साथ अपडेट करें।


1

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


1

यदि डेटाबेस लिंक का विकल्प उपलब्ध नहीं है, तो आपके द्वारा लिया जा सकने वाला एक अन्य मार्ग ओडीबीसी के माध्यम से तालिकाओं को जोड़ने के लिए है, जैसे कि एमएस एक्सेस या क्रिस्टल रिपोर्टें और वहां शामिल हों।


0

शायद हार्ड-कोडेड डेटाबेस नाम एसक्यूएल-क्वेरी के भीतर हमेशा सबसे अच्छा तरीका नहीं है। इस प्रकार, समानार्थी शब्द जोड़ना एक बेहतर दृष्टिकोण होगा। यह हमेशा ऐसा नहीं होता है कि डेटाबेस में कई स्टेजिंग परिवेशों में एक ही नाम होता है। वे PROD, UAT, SIT, QA और इसके बाद के पोस्टफ़िक्स द्वारा शामिल हो सकते हैं। इसलिए हार्ड-कोडेड प्रश्नों से अवगत रहें और उन्हें अधिक गतिशील बनाएं।

दृष्टिकोण # 1: समान सर्वर पर डेटाबेस के बीच तालिकाओं को जोड़ने के लिए समानार्थी शब्द का उपयोग करें।

दृष्टिकोण # 2: प्रत्येक डेटाबेस से अलग से डेटा एकत्र करें और इसे अपने कोड में शामिल करें। आपके डेटाबेस कनेक्शन के तार डेटाबेस या कॉन्फ़िगरेशन फ़ाइल के माध्यम से आपके ऐप-सर्वर कॉन्फ़िगरेशन का हिस्सा हो सकते हैं।


-2

मैंने नीचे इस कोड की कोशिश की और यह ठीक काम कर रहा है

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID

उत्तर सामान्य होने चाहिए, न कि केवल आपके उपयोग के मामलों की कॉपी-पेस्ट। साथ ही, यह उस उपयोगकर्ता की मदद नहीं करता है जिसने सवाल बनाया था।
व्लादिमीर ग्रामाचो

-2

आप निम्नलिखित की कोशिश कर सकते हैं:

select customer1.Id,customer1.Name,customer1.city,CustAdd.phone,CustAdd.Country
from customer1
inner join [EBST08].[Test].[dbo].[customerAddress] CustAdd
on customer1.Id=CustAdd.CustId

-2

इसके लिए बस नीचे क्वेरी का पालन करें

select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id

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


-2

जब मुझे उन दो तालिकाओं में शामिल होने में परेशानी हो रही थी, तो मैं एक ही समय में दोनों दूरस्थ डेटाबेसों को खोलकर वास्तव में वही कर रहा था जो मैं चाहता था। MySQL 5.6 (php 7.1) और दूसरा MySQL 5.1 (php 5.6)

//Open a new connection to the MySQL server
$mysqli1 = new mysqli('server1','user1','password1','database1');
$mysqli2 = new mysqli('server2','user2','password2','database2');

//Output any connection error
if ($mysqli1->connect_error) {
    die('Error : ('. $mysqli1->connect_errno .') '. $mysqli1->connect_error);
} else { 
echo "DB1 open OK<br>";
}
if ($mysqli2->connect_error) {
    die('Error : ('. $mysqli2->connect_errno .') '. $mysqli2->connect_error);
} else { 
echo "DB2 open OK<br><br>";
}

यदि आपको स्क्रीन पर वे दो ओके मिलते हैं, तो दोनों डेटाबेस खुले और तैयार हैं। फिर आप अपनी क्वेरी करने के लिए आगे बढ़ सकते हैं।

$results = $mysqli1->query("SELECT * FROM video where video_id_old is NULL");
    while($row = $results->fetch_array()) {
        $theID = $row[0];
        echo "Original ID : ".$theID." <br>";
        $doInsert = $mysqli2->query("INSERT INTO video (...) VALUES (...)");
        $doGetVideoID = $mysqli2->query("SELECT video_id, time_stamp from video where user_id = '".$row[13]."' and time_stamp = ".$row[28]." ");
            while($row = $doGetVideoID->fetch_assoc()) {
                echo "New video_id : ".$row["video_id"]." user_id : ".$row["user_id"]." time_stamp : ".$row["time_stamp"]."<br>";
                $sql = "UPDATE video SET video_id_old = video_id, video_id = ".$row["video_id"]." where user_id = '".$row["user_id"]."' and video_id = ".$theID.";";
                $sql .= "UPDATE video_audio SET video_id = ".$row["video_id"]." where video_id = ".$theID.";";
                // Execute multi query if you want
                if (mysqli_multi_query($mysqli1, $sql)) {
                    // Query successful do whatever...
                }
            }
    }
// close connection 
$mysqli1->close();
$mysqli2->close();

मैं कुछ जोड़-घटाव करने की कोशिश कर रहा था, लेकिन जब से मुझे वो दो DB मिल गए, तब मैं कनेक्शन बदलकर $mysqli1या करके क्वेरी आगे-पीछे कर सकता हूं$mysqli2

यह मेरे लिए काम करता है, मुझे आशा है कि यह मदद करता है ... चीयर्स


मुझे लगता है कि किसी ने भी php का उपयोग नहीं करने के लिए कहा था ... मेरे पास एक ही मुद्दा था और मैं इसे कुछ प्रोग्रामिंग के साथ हल करने में सक्षम था
लुइस एच कैबेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.