서로 다른 서버의 두 데이터베이스에 있는 두 개의 테이블을 결합하여 데이터 쿼리
서로 다른 서버에 있는 두 개의 서로 다른 데이터베이스에 두 개의 테이블이 있는데, 저는 몇 가지 쿼리를 하기 위해 테이블을 결합해야 합니다.어떤 선택지가 있습니까?어떻게 해야 하나?
다음을 사용해야 합니다.sp_addlinkedserver
서버 링크를 만듭니다.사용 방법은 참조 설명서를 참조하십시오.서버 연결이 설정되면, 데이터베이스 이름 앞에 다른 서버를 붙이면 쿼리가 정상적으로 구성됩니다.I.E:
-- 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
쿼리를 사용하여 일부 데이터를 필터링할 경우 시간과 성능을 절약할 수 있습니다.
사용해 보십시오.
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
연결된 서버가 DBA에 의해 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다.Books Online은 필요한 구문을 제공합니다.
실질적인 엔터프라이즈 관점에서 데이터베이스 테이블의 미러링된 복사본을 데이터베이스에 만든 다음 작업/프로크에서 매 시간 델타로 업데이트하는 것이 가장 좋습니다.
두 테이블의 조인은 DBMS에서 수행하는 것이 가장 좋으므로 이러한 방식으로 수행해야 합니다.데이터베이스 중 하나에 있는 작은 표 또는 그 하위 집합을 미러링한 후 결합할 수 있습니다.인포매티카와 같은 ETL 서버에서 이 작업을 하고 싶을 수도 있지만 테이블이 크면 권장되지 않을 것입니다.
데이터베이스 연결 옵션을 사용할 수 없는 경우 ODBC를 통해 테이블을 MS Access 또는 Crystal 보고서와 같은 항목에 연결하고 거기서 조인을 수행할 수도 있습니다.
하드 코딩된 데이터베이스 이름이 SQL 쿼리 내에서 항상 최선의 방법은 아닐 수 있습니다.따라서 동의어를 추가하는 것이 더 나은 접근 방식이 될 것입니다.데이터베이스가 여러 준비 환경에서 동일한 이름을 갖는 것은 아닙니다.PROD, UAT, SIT, QA 등과 같은 포스트픽스로 구성될 수 있습니다.따라서 하드 코딩된 쿼리를 인식하고 쿼리를 보다 동적으로 만듭니다.
접근법 #1: 동의어를 사용하여 동일한 서버의 데이터베이스 간에 표를 연결합니다.
접근법 #2: 각 데이터베이스에서 개별적으로 데이터를 수집하고 코드에 참여합니다.데이터베이스 연결 문자열은 데이터베이스 또는 구성 파일을 통해 App-server 구성의 일부가 될 수 있습니다.
아래 코드를 사용해 봤는데 정상적으로 작동합니다.
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
다음을 시도할 수 있습니다.
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
이 두 테이블을 함께 사용하는 데 어려움을 겪던 중, 원격 데이터베이스 두 개를 동시에 열어 원하는 작업을 모두 수행할 수 있었습니다.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
제게 효과가 있었어요 도움이 됐으면 좋겠어요건배.
이것에 대해서는 아래 질문에 간단히 답하시오.
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
내가 데이터베이스 이름을 작성한 곳에서, 당신은 데이터베이스의 이름을 정의해야 합니다.동일한 데이터베이스에 있으므로 데이터베이스 이름을 정의할 필요가 없지만 다른 데이터베이스에 있는 경우 데이터베이스 이름을 경로로 언급해야 합니다. 그렇지 않으면 오류가 표시됩니다.내가 당신의 일을 쉽게 만들었기를 바랍니다.
언급URL : https://stackoverflow.com/questions/5145637/querying-data-by-joining-two-tables-in-two-database-on-different-servers
'programing' 카테고리의 다른 글
텍스트 파일의 전체 줄을 줄 번호로 바꾸는 방법 (0) | 2023.04.27 |
---|---|
Excel VBA 코드 단위 테스트 방법 (0) | 2023.04.27 |
zure 웹 사이트에서 업로드된 인증서 액세스 (0) | 2023.04.27 |
두 지점의 차이를 어떻게 볼 수 있습니까? (0) | 2023.04.27 |
SQL Server에 대한 "LIKE"와 "IN"의 조합 (0) | 2023.04.27 |