Câu trả lời:
Bạn sẽ cần sử dụng sp_addlinkedserver
để tạo liên kết máy chủ. Xem tài liệu tham khảo để sử dụng. Khi liên kết máy chủ được thiết lập, bạn sẽ tạo truy vấn như bình thường, chỉ cần thêm tiền tố tên cơ sở dữ liệu với máy chủ khác. I E:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Sau khi liên kết được thiết lập, bạn cũng có thể sử dụng OPENQUERY
để thực thi một câu lệnh SQL trên máy chủ từ xa và chỉ chuyển dữ liệu trở lại cho bạn. Điều này có thể nhanh hơn một chút và nó sẽ cho phép máy chủ từ xa tối ưu hóa truy vấn của bạn. Nếu bạn lưu dữ liệu vào bộ nhớ cache trong một bảng tạm thời (hoặc trong bộ nhớ) DB1
trong ví dụ trên, thì bạn sẽ có thể truy vấn nó giống như tham gia một bảng tiêu chuẩn. Ví dụ:
-- 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
Kiểm tra tài liệu cho OPENQUERY để xem thêm một số ví dụ. Ví dụ trên là khá giả. Tôi chắc chắn sẽ sử dụng phương pháp đầu tiên trong ví dụ cụ thể này, nhưng tùy chọn thứ hai sử dụng OPENQUERY
có thể tiết kiệm thời gian và hiệu suất nếu bạn sử dụng truy vấn để lọc ra một số dữ liệu.
Thử cái này:
SELECT tab2.column_name
FROM [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2] tab2
ON tab1.col_name = tab2.col_name
Việc kết hợp hai bảng tốt nhất được thực hiện bởi DBMS, vì vậy nó nên được thực hiện theo cách đó. Bạn có thể phản chiếu bảng nhỏ hơn hoặc tập hợp con của nó trên một trong các cơ sở dữ liệu và sau đó nối chúng. Người ta có thể bị cám dỗ làm điều này trên một máy chủ ETL như Informatica nhưng tôi đoán không nên làm nếu các bảng quá lớn.
Có thể tên cơ sở dữ liệu được mã hóa cứng không phải là cách tiếp cận tốt nhất luôn trong truy vấn SQL. Do đó, thêm các từ đồng nghĩa sẽ là một cách tiếp cận tốt hơn. Không phải lúc nào các cơ sở dữ liệu cũng có tên giống nhau trên một số môi trường dàn dựng. Chúng có thể bao gồm các hậu tố như PROD, UAT, SIT, QA, v.v. Vì vậy, hãy lưu ý đến các truy vấn được mã hóa cứng và làm cho chúng năng động hơn.
Cách tiếp cận # 1: Sử dụng các từ đồng nghĩa để liên kết các bảng giữa các cơ sở dữ liệu trên cùng một máy chủ.
Phương pháp tiếp cận # 2: Thu thập dữ liệu riêng biệt từ mỗi cơ sở dữ liệu và nối nó vào mã của bạn. Chuỗi kết nối cơ sở dữ liệu của bạn có thể là một phần của cấu hình Máy chủ ứng dụng của bạn thông qua cơ sở dữ liệu hoặc tệp cấu hình.
Tôi đã thử mã này bên dưới và nó hoạt động tốt
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Bạn có thể thử những cách sau:
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
cho điều này, chỉ cần làm theo truy vấn dưới đây
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
Nơi tôi đã viết tên cơ sở dữ liệu, bạn phải xác định tên của cơ sở dữ liệu. Nếu bạn đang ở trong cùng một cơ sở dữ liệu, do đó bạn không cần xác định tên cơ sở dữ liệu nhưng nếu bạn đang ở trong cơ sở dữ liệu khác, bạn phải đề cập đến tên cơ sở dữ liệu dưới dạng đường dẫn nếu không nó sẽ cho bạn thấy lỗi. Hy vọng tôi đã làm cho công việc của bạn dễ dàng
Trong khi tôi gặp sự cố khi tham gia hai bảng đó, tôi đã thực hiện chính xác những gì tôi muốn bằng cách mở cả hai cơ sở dữ liệu từ xa cùng một lúc. MySQL 5.6 (php 7.1) và MySQL 5.1 (php 5.6) khác
//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>";
}
Nếu bạn thấy hai chữ OK đó trên màn hình, thì cả hai cơ sở dữ liệu đều đang mở và sẵn sàng. Sau đó, bạn có thể tiếp tục thực hiện các truy vấn của mình.
$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();
Tôi đã cố gắng thực hiện một số phép nối nhưng vì tôi đã mở hai DB đó, sau đó tôi có thể quay lại thực hiện các truy vấn chỉ bằng cách thay đổi kết nối $mysqli1
hoặc$mysqli2
Nó đã làm việc cho tôi, tôi hy vọng nó sẽ giúp ...