Truy vấn dữ liệu bằng cách nối hai bảng trong hai cơ sở dữ liệu trên các máy chủ khác nhau


102

Có hai bảng trong hai cơ sở dữ liệu khác nhau trên các máy chủ khác nhau, tôi cần kết hợp chúng để thực hiện ít truy vấn. Tôi có những lựa chọn nào? Tôi nên làm gì?


Thích nếu PRAMP đưa bạn đến đây
Janac Meena

Câu trả lời:


85

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ớ) DB1trong 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 OPENQUERYcó 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.


1
là nó có thể với php-mysql .. nếu có thì bạn có thể vui lòng gợi ý cho tôi cách làm thế nào để tôi có thể phát triển với tùy chọn đó không?
Jhanvi

1
Tôi không biết liệu MySQL có hỗ trợ các máy chủ được liên kết hay không. Câu trả lời này dành riêng cho máy chủ Microsoft SQL.
Scott Anderson

3
Nếu ai đó đang tìm kiếm câu trả lời cho PostgreSQL, hãy thử cái này: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland

7

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

5

Nếu máy chủ được liên kết không được dba của bạn cho phép, bạn có thể sử dụng OPENROWSET. Books Online sẽ cung cấp cú pháp bạn cần.


4

Từ góc độ thực tế của doanh nghiệp, cách tốt nhất là tạo một bản sao được nhân đôi của bảng cơ sở dữ liệu trong cơ sở dữ liệu của bạn và sau đó chỉ cần có một nhiệm vụ / chương trình cập nhật nó với delta mỗi giờ.


1

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.


1

Nếu tùy chọn liên kết cơ sở dữ liệu không có sẵn, một cách khác bạn có thể thực hiện là liên kết các bảng qua ODBC với một cái gì đó chẳng hạn như báo cáo MS Access hoặc Crystal và thực hiện nối ở đó.


0

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.


-2

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

Các câu trả lời phải chung chung, không chỉ là bản sao dán các trường hợp sử dụng của bạn. Ngoài ra, điều này không giúp ích gì cho người dùng đã đưa ra câu hỏi.
Wladimir Gramacho

-2

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

-2

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


-2

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 $mysqli1hoặc$mysqli2

Nó đã làm việc cho tôi, tôi hy vọng nó sẽ giúp ...


Tôi đoán không ai nói không sử dụng php ... Tôi đã cùng một vấn đề và tôi đã có thể giải quyết nó với một số chương trình
Luis H Cabrejo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.