বিভিন্ন সার্ভারে দুটি ডাটাবেসে দুটি টেবিল যোগ দিয়ে ডেটা অনুসন্ধান করা


103

বিভিন্ন সার্ভারে দুটি পৃথক ডাটাবেসে দুটি টেবিল রয়েছে, কয়েকটি প্রশ্ন তৈরি করতে আমার এগুলিতে যোগ দেওয়া দরকার। আমার কাছে কী বিকল্প আছে? আমার কি করা উচিৎ?


4
পছন্দ করুন যদি PRAMP আপনাকে এখানে নিয়ে আসে
জানাক মীনা

উত্তর:


87

আপনাকে sp_addlinkedserverএকটি সার্ভার লিঙ্ক তৈরি করতে ব্যবহার করতে হবে। ব্যবহারের জন্য রেফারেন্স ডকুমেন্টেশন দেখুন । একবার সার্ভার লিঙ্কটি প্রতিষ্ঠিত হয়ে গেলে, আপনি অন্যান্য সার্ভারের সাথে ডাটাবেসের নাম উপসর্গ করে, সাধারণ হিসাবে ক্যোয়ারীটি তৈরি করবেন। আইই:

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

লিঙ্কটি একবার প্রতিষ্ঠিত হয়ে গেলে, আপনি OPENQUERYরিমোট সার্ভারে একটি এসকিউএল বিবৃতি কার্যকর করতে এবং কেবলমাত্র ডেটা আপনার কাছে ফিরিয়ে আনতে ব্যবহার করতে পারেন। এটি কিছুটা দ্রুত হতে পারে এবং এটি দূরবর্তী সার্ভারকে আপনার ক্যোয়ারীটি অনুকূল করতে দেয়। যদি আপনি 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আপনি কিছু ডেটা ফিল্টার করার জন্য কোয়েরিটি ব্যবহার করলে কিছু সময় এবং কার্যকারিতা বাঁচাতে পারে।


4
এটি কি পিএইচপি-মাইএসকিএল দিয়ে সম্ভব .. যদি হ্যাঁ তবে আপনি কীভাবে আমাকে এই বিকল্পটি দিয়ে বাড়াতে পারেন এমন কোনও উপায়ের পরামর্শ দিতে পারেন?
জানভি

4
মাইএসকিউএল লিঙ্কযুক্ত সার্ভারগুলি সমর্থন করে কিনা আমার কোনও ধারণা নেই। এই উত্তরটি মাইক্রোসফ্ট এসকিউএল সার্ভারের সাথে নির্দিষ্ট।
স্কট অ্যান্ডারসন

4
যদি কেউ পোস্টগ্রিজএসকিউএল উত্তর খুঁজছেন, তবে এটি ব্যবহার করে দেখুন: postgresql.org/docs/9.4/static/postgres-fdw.html
পিজেএসকোপল্যান্ড


5

যদি কোনও লিংকযুক্ত সার্ভারটি আপনার ডিবিএ দ্বারা অনুমোদিত না হয় তবে আপনি 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

এই দুটি টেবিলটিতে যোগ দিতে যখন আমার সমস্যা হচ্ছে, তখন একই সাথে দুটি দূরবর্তী ডেটাবেস খোলার মাধ্যমে আমি যা করতে চেয়েছিলাম ঠিক তা করতেই আমি পালিয়ে গেলাম। মাইএসকিউএল 5.6 (পিএইচপি 7.1) এবং অন্যান্য মাইএসকিউএল 5.1 (পিএইচপি 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();

আমি কিছু যোগদান করার চেষ্টা করা হয়েছিল কিন্তু যেহেতু আমি ঐ দুই DBS খুলতে গেলাম, তারপর আমি ফিরে যেতে পারেন এদিক ওদিক মাত্র সংযোগ পরিবর্তন করে querys করছেন $mysqli1বা$mysqli2

এটি আমার পক্ষে কাজ করেছে, আমি আশা করি এটি সাহায্য করবে ... চিয়ার্স


আমার ধারণা, কেউ পিএইচপি ব্যবহার না করার কথা বলেছিল ... আমারও একই সমস্যা ছিল এবং আমি কিছু প্রোগ্রামিং দিয়ে এটি সমাধান করতে সক্ষম হয়েছি
লুইস এইচ ক্যাব্রেজো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.