การสืบค้นข้อมูลโดยรวมสองตารางในสองฐานข้อมูลบนเซิร์ฟเวอร์ที่แตกต่างกัน


103

มีสองตารางในสองฐานข้อมูลที่แตกต่างกันบนเซิร์ฟเวอร์ที่แตกต่างกันฉันจำเป็นต้องเข้าร่วมเพื่อสร้างแบบสอบถามเล็กน้อย ฉันมีตัวเลือกอะไรบ้าง? ฉันควรทำอย่างไรดี?


1
เช่นเดียวกับที่ PRAMP พาคุณมาที่นี่
Janac Meena

คำตอบ:


87

คุณจะต้องใช้sp_addlinkedserverเพื่อสร้างลิงค์เซิร์ฟเวอร์ ดูเอกสารอ้างอิงสำหรับการใช้งาน เมื่อสร้างลิงก์เซิร์ฟเวอร์แล้วคุณจะสร้างแบบสอบถามตามปกติเพียงแค่นำหน้าชื่อฐานข้อมูลกับเซิร์ฟเวอร์อื่น IE:

-- 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 .. ถ้าได้โปรดช่วยแนะนำวิธีที่ฉันจะเติบโตด้วยตัวเลือกนั้นได้อย่างไร
Jhanvi

1
ฉันไม่รู้ว่า MySQL รองรับเซิร์ฟเวอร์ที่เชื่อมโยงหรือไม่ คำตอบนี้เฉพาะสำหรับเซิร์ฟเวอร์ Microsoft SQL
Scott Anderson

3
หากใครกำลังมองหาคำตอบของ PostgreSQL ลองทำตามนี้: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland


5

หาก dba ของคุณไม่อนุญาตเซิร์ฟเวอร์ที่เชื่อมโยงคุณสามารถใช้ OPENROWSET Books Online จะให้ไวยากรณ์ที่คุณต้องการ


4

จากมุมมองขององค์กรที่ใช้งานได้จริงแนวทางปฏิบัติที่ดีที่สุดคือการทำสำเนาตารางฐานข้อมูลแบบมิเรอร์ในฐานข้อมูลของคุณจากนั้นให้อัปเดตงาน / proc ด้วยเดลต้าทุกชั่วโมง


1

การรวมตารางสองตารางทำได้ดีที่สุดโดย DBMS ดังนั้นจึงควรทำเช่นนั้น คุณสามารถมิเรอร์ตารางที่เล็กกว่าหรือส่วนย่อยของตารางบนฐานข้อมูลใดฐานข้อมูลหนึ่งแล้วรวมเข้าด้วยกัน อาจมีใครอยากทำสิ่งนี้บนเซิร์ฟเวอร์ ETL เช่น Informatica แต่ฉันเดาว่าไม่แนะนำให้ทำหากตารางมีขนาดใหญ่


1

หากไม่มีตัวเลือกการเชื่อมโยงฐานข้อมูลเส้นทางอื่นที่คุณสามารถทำได้คือการเชื่อมโยงตารางผ่าน ODBC กับบางสิ่งเช่นรายงาน MS Access หรือ Crystal และทำการเข้าร่วมที่นั่น


0

บางทีชื่อฐานข้อมูลแบบฮาร์ดโค้ดอาจไม่ใช่แนวทางที่ดีที่สุดใน SQL-query เสมอไป ดังนั้นการเพิ่มคำพ้องความหมายจะเป็นแนวทางที่ดีกว่า ไม่ใช่กรณีเสมอไปที่ฐานข้อมูลจะมีชื่อเดียวกันในหลายสภาพแวดล้อมการจัดเตรียม อาจประกอบด้วย postfix เช่น 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

คำตอบควรเป็นแบบทั่วไปไม่ใช่แค่คัดลอกวางกรณีการใช้งานของคุณ นอกจากนี้สิ่งนี้ไม่ได้ช่วยผู้ใช้ที่ตั้งคำถาม
Wladimir Gramacho

-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

ที่ฉันเขียน databasename คุณต้องกำหนดชื่อของฐานข้อมูล หากคุณอยู่ในฐานข้อมูลเดียวกันดังนั้นคุณไม่จำเป็นต้องกำหนดชื่อฐานข้อมูล แต่ถ้าคุณอยู่ในฐานข้อมูลอื่นคุณต้องระบุชื่อฐานข้อมูลเป็นพา ธ มิฉะนั้นจะแสดงข้อผิดพลาด หวังว่าฉันจะทำให้งานของคุณง่ายขึ้น


-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();

ฉันพยายามทำการรวมบางอย่าง แต่เนื่องจากฉันเปิดฐานข้อมูลทั้งสองนี้ฉันจึงสามารถย้อนกลับไปมาเพื่อทำแบบสอบถามได้โดยเพียงแค่เปลี่ยนการเชื่อมต่อ$mysqli1หรือ$mysqli2

มันได้ผลสำหรับฉันฉันหวังว่ามันจะช่วยได้ ... ไชโย


ฉันเดาว่าไม่มีใครบอกว่าจะไม่ใช้ php ... ฉันมีปัญหาเดียวกันและฉันสามารถแก้ไขได้ด้วยการเขียนโปรแกรมบางอย่าง
Luis H Cabrejo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.