서로 다른 서버의 두 데이터베이스에있는 두 테이블을 결합하여 데이터 쿼리


102

서로 다른 서버에있는 두 개의 서로 다른 데이터베이스에 두 개의 테이블이 있습니다. 몇 가지 쿼리를 만들기 위해 조인해야합니다. 어떤 옵션이 있습니까? 어떻게해야합니까?


PRAMP가 여기로 데려온 것처럼
Janac Meena

답변:


86

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

7

이 시도:

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

연결된 서버가 dba에서 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다. 온라인 설명서에서 필요한 구문을 제공합니다.


4

실용적인 엔터프라이즈 관점에서 가장 좋은 방법은 데이터베이스에 데이터베이스 테이블의 미러링 된 복사본을 만든 다음 작업 / 프로 시저가 매시간 델타로 업데이트하도록하는 것입니다.


1

두 테이블의 조인은 DBMS에서 가장 잘 수행되므로 그렇게해야합니다. 데이터베이스 중 하나에서 더 작은 테이블 또는 그 하위 집합을 미러링 한 다음 조인 할 수 있습니다. informatica와 같은 ETL 서버에서이 작업을 수행하려는 유혹을받을 수 있지만 테이블이 거대하면 권장하지 않습니다.


1

데이터베이스 연결 옵션을 사용할 수없는 경우 취할 수있는 또 다른 방법은 ODBC를 통해 테이블을 MS Access 또는 Crystal 보고서와 같은 항목에 연결하고 거기에서 조인하는 것입니다.


0

하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 접근 방식이 아닐 수 있습니다. 따라서 동의어를 추가하는 것이 더 나은 방법입니다. 여러 스테이징 환경에서 데이터베이스가 항상 동일한 이름을 갖는 것은 아닙니다. 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>";
}

화면에 두 개의 OK가 표시되면 두 데이터베이스가 모두 열려 있고 준비된 것입니다. 그런 다음 쿼리를 진행할 수 있습니다.

$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를 열고 가지고 있기 때문에, 나는 다시 갈 수 갔다 단지 연결을 변경하여 querys을하고 $mysqli1또는$mysqli2

그것은 나를 위해 일했습니다. 도움이되기를 바랍니다. 건배


나는 아무도 PHP를 사용하지 않는 말했다 같아요 ... 저도 같은 문제를했고 나는 약간의 프로그래밍을 해결할 수 있었다
루이스 H Cabrejo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.