code

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

codestyles 2020. 9. 8. 08:00
반응형

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


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


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을 사용하면 쿼리를 사용하여 일부 데이터를 필터링 할 경우 시간과 성능을 절약 할 수 있습니다.


이 시도:

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을 사용할 수 있습니다. 온라인 설명서에서 필요한 구문을 제공합니다.


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


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


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


Maybe hard-coded database names isn't the best approach always within an SQL-query. Thus, adding synonyms would be a better approach. It's not always the case that databases have the same name across several staging environments. They might consist by postfixes like PROD, UAT, SIT, QA and so forth. So be aware of hard-coded queries and make them more dynamic.

Approach #1: Use synonyms to link tables between databases on the same server.

Approach #2: Collect data separately from each database and join it in your code. Your database connection strings could be part of your App-server configuration through either a database or a config file.


I tried this code below and it's working fine

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID

You could try the following:

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

for this simply follow below query

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

Where I wrote databasename, you have to define the name of the database. If you are in same database so you don't need to define the database name but if you are in other database you have to mention database name as path or it will show you error. Hope I made your work easy


While I was having trouble join those two tables, I got away with doing exactly what I wanted by opening both remote databases at the same time. MySQL 5.6 (php 7.1) and the other 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>";
}

If you get those two OKs on screen, then both databases are open and ready. Then you can proceed to do your querys.

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

I was trying to do some joins but since I got those two DBs open, then I can go back and forth doing querys by just changing the connection $mysqli1 or $mysqli2

It worked for me, I hope it helps... Cheers

참고URL : https://stackoverflow.com/questions/5145637/querying-data-by-joining-two-tables-in-two-database-on-different-servers

반응형