복붙노트

[SQL] 다른 서버에 두 개의 데이터베이스에 두 개의 테이블을 조인하여 데이터를 쿼리

SQL

다른 서버에 두 개의 데이터베이스에 두 개의 테이블을 조인하여 데이터를 쿼리

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

해결법

  1. ==============================

    1.당신은 서버 링크를 만들 sp_addlinkedserver를 사용해야합니다. 사용에 대한 참조 설명서를 참조하십시오. 서버 연결이 설정되면, 당신은 단지 다른 서버와 데이터베이스 이름을 접두어로, 정상으로 쿼리를 만들 수 있습니다. 즉 :

    당신은 서버 링크를 만들 sp_addlinkedserver를 사용해야합니다. 사용에 대한 참조 설명서를 참조하십시오. 서버 연결이 설정되면, 당신은 단지 다른 서버와 데이터베이스 이름을 접두어로, 정상으로 쿼리를 만들 수 있습니다. 즉 :

    -- FROM DB1
    SELECT *
    FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
        INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
            ON tab1.ID = tab2.ID
    

    링크가 설정되면, 당신은 또한 원격 서버에 SQL 문을 실행하고 만 데이터 등을 전송 OPENQUERY를 사용할 수 있습니다. 이것은 조금 더 빠를 수 있고, 원격 서버가 쿼리를 최적화 할 수 있습니다. 위의 예에서 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를 사용하여 두 번째 옵션은 약간의 시간과 성능을 절약 할 수 있습니다.

  2. ==============================

    2.이 시도:

    이 시도:

    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
    
  3. ==============================

    3.연결된 서버가 귀하의 DBA에 의해 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다. 온라인 당신이 필요로하는 구문을 제공 할 것입니다.

    연결된 서버가 귀하의 DBA에 의해 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다. 온라인 당신이 필요로하는 구문을 제공 할 것입니다.

  4. ==============================

    4.실제 기업의 관점에서 볼 때, 가장 좋은 방법은 데이터베이스의 데이터베이스 테이블의 미러 사본을 만드는 것입니다, 그리고 단지 델타의 모든 시간과 작업 / PROC 업데이트를해야합니다.

    실제 기업의 관점에서 볼 때, 가장 좋은 방법은 데이터베이스의 데이터베이스 테이블의 미러 사본을 만드는 것입니다, 그리고 단지 델타의 모든 시간과 작업 / PROC 업데이트를해야합니다.

  5. ==============================

    5.이 방법이 있음을 수행해야하므로 A는 최고의 DBMS에 의해 수행되는 두 개의 테이블을 조인. 당신은 데이터베이스 중 하나에 작은 테이블 또는 그것의 일부를 반영하고 그들과 합류 할 수있다. 하나는 인포매티카 같은 ETL 서버에이 일의 유혹을받을 수도 있지만 테이블이 큰 경우 I는 바람직하지 같아요.

    이 방법이 있음을 수행해야하므로 A는 최고의 DBMS에 의해 수행되는 두 개의 테이블을 조인. 당신은 데이터베이스 중 하나에 작은 테이블 또는 그것의 일부를 반영하고 그들과 합류 할 수있다. 하나는 인포매티카 같은 ETL 서버에이 일의 유혹을받을 수도 있지만 테이블이 큰 경우 I는 바람직하지 같아요.

  6. ==============================

    6.데이터베이스 연결 옵션을 사용할 수없는 경우, 당신이 취할 수있는 또 다른 경로는이 가입 MS Access 또는 크리스탈 리포트와 같은 뭔가 ODBC를 통해 테이블을 연결하는 것입니다.

    데이터베이스 연결 옵션을 사용할 수없는 경우, 당신이 취할 수있는 또 다른 경로는이 가입 MS Access 또는 크리스탈 리포트와 같은 뭔가 ODBC를 통해 테이블을 연결하는 것입니다.

  7. ==============================

    7.아마 하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 방법이 아니다. 따라서, 동의어를 추가하면 더 나은 방법이 될 것입니다. 항상 데이터베이스가 여러 스테이징 환경에서 같은 이름을 가지고 그렇지 않다. 그들은 등 PROD, UAT, SIT, QA와 같은 포스트 픽스에 의해 구성 될 수 있습니다. 그래서 하드 코딩 된 쿼리를 인식하고 그들에게 더 역동적를합니다.

    아마 하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 방법이 아니다. 따라서, 동의어를 추가하면 더 나은 방법이 될 것입니다. 항상 데이터베이스가 여러 스테이징 환경에서 같은 이름을 가지고 그렇지 않다. 그들은 등 PROD, UAT, SIT, QA와 같은 포스트 픽스에 의해 구성 될 수 있습니다. 그래서 하드 코딩 된 쿼리를 인식하고 그들에게 더 역동적를합니다.

    동일한 서버에 데이터베이스 사이의 연결 테이블을 사용하여 동의어 : # 1에 접근.

    각 데이터베이스에서 별도로 수집 된 데이터 및 코드에 가입 : # 2에 접근. 데이터베이스 연결 문자열은 데이터베이스 또는 설정 파일 중 하나를 통해 응용 프로그램 서버 구성의 일부가 될 수 있습니다.

  8. ==============================

    8.나는 다음이 코드를 시도하고 잘 작동 것

    나는 다음이 코드를 시도하고 잘 작동 것

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

    9.다음을 시도해 볼 수도 있습니다 :

    다음을 시도해 볼 수도 있습니다 :

    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
    
  10. ==============================

    10.이를 위해 단순히 쿼리 아래의 사항을 지켜

    이를 위해 단순히 쿼리 아래의 사항을 지켜

    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을 쓴 경우, 당신은 데이터베이스의 이름을 정의해야합니다. 데이터베이스 이름을 정의 할 필요가 없습니다, 그래서 당신은 동일한 데이터베이스에 있지만 다른 데이터베이스에있는 경우는 경로로 데이터베이스 이름을 언급하거나 당신이 오류가 표시됩니다. 희망 나는 쉽게 작업을했다

  11. ==============================

    11.나는 문제가 두 테이블을 조인 가지는 동안, 나는 멀리 나는 두 가지를 동시에 원격 데이터베이스를 열어 원하는 정확히 어떤 일에 얻었다. MySQL은 5.6 (PHP 7.1)와 다른 MySQL을 5.1 (PHP 5.6)

    나는 문제가 두 테이블을 조인 가지는 동안, 나는 멀리 나는 두 가지를 동시에 원격 데이터베이스를 열어 원하는 정확히 어떤 일에 얻었다. 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>";
    }
    

    당신이 화면에 두 OKS를 얻을 경우, 두 데이터베이스가 오픈 준비가되어 있습니다. 그런 다음 당신은 당신의 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();
    

    나는 약간 조인을하려고했지만 내가 가진 이후 두 DB를 열고, 나는 다시 갈 수 갔다 바로 연결 $의 mysqli1 또는 $ mysqli2을 변경하여 querys을하고

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

  12. from https://stackoverflow.com/questions/5145637/querying-data-by-joining-two-tables-in-two-database-on-different-servers by cc-by-sa and MIT license