[SQL] 다른 서버에 두 개의 데이터베이스에 두 개의 테이블을 조인하여 데이터를 쿼리
SQL다른 서버에 두 개의 데이터베이스에 두 개의 테이블을 조인하여 데이터를 쿼리
몇 쿼리를 만들기 위해 다른 서버에 두 개의 서로 다른 데이터베이스의 두 테이블이 있습니다, 그래서 그들과 합류해야합니다. 나는 어떤 옵션이 있습니까? 어떻게해야합니까?
해결법
-
==============================
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.이 시도:
이 시도:
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.연결된 서버가 귀하의 DBA에 의해 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다. 온라인 당신이 필요로하는 구문을 제공 할 것입니다.
연결된 서버가 귀하의 DBA에 의해 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다. 온라인 당신이 필요로하는 구문을 제공 할 것입니다.
-
==============================
4.실제 기업의 관점에서 볼 때, 가장 좋은 방법은 데이터베이스의 데이터베이스 테이블의 미러 사본을 만드는 것입니다, 그리고 단지 델타의 모든 시간과 작업 / PROC 업데이트를해야합니다.
실제 기업의 관점에서 볼 때, 가장 좋은 방법은 데이터베이스의 데이터베이스 테이블의 미러 사본을 만드는 것입니다, 그리고 단지 델타의 모든 시간과 작업 / PROC 업데이트를해야합니다.
-
==============================
5.이 방법이 있음을 수행해야하므로 A는 최고의 DBMS에 의해 수행되는 두 개의 테이블을 조인. 당신은 데이터베이스 중 하나에 작은 테이블 또는 그것의 일부를 반영하고 그들과 합류 할 수있다. 하나는 인포매티카 같은 ETL 서버에이 일의 유혹을받을 수도 있지만 테이블이 큰 경우 I는 바람직하지 같아요.
이 방법이 있음을 수행해야하므로 A는 최고의 DBMS에 의해 수행되는 두 개의 테이블을 조인. 당신은 데이터베이스 중 하나에 작은 테이블 또는 그것의 일부를 반영하고 그들과 합류 할 수있다. 하나는 인포매티카 같은 ETL 서버에이 일의 유혹을받을 수도 있지만 테이블이 큰 경우 I는 바람직하지 같아요.
-
==============================
6.데이터베이스 연결 옵션을 사용할 수없는 경우, 당신이 취할 수있는 또 다른 경로는이 가입 MS Access 또는 크리스탈 리포트와 같은 뭔가 ODBC를 통해 테이블을 연결하는 것입니다.
데이터베이스 연결 옵션을 사용할 수없는 경우, 당신이 취할 수있는 또 다른 경로는이 가입 MS Access 또는 크리스탈 리포트와 같은 뭔가 ODBC를 통해 테이블을 연결하는 것입니다.
-
==============================
7.아마 하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 방법이 아니다. 따라서, 동의어를 추가하면 더 나은 방법이 될 것입니다. 항상 데이터베이스가 여러 스테이징 환경에서 같은 이름을 가지고 그렇지 않다. 그들은 등 PROD, UAT, SIT, QA와 같은 포스트 픽스에 의해 구성 될 수 있습니다. 그래서 하드 코딩 된 쿼리를 인식하고 그들에게 더 역동적를합니다.
아마 하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 방법이 아니다. 따라서, 동의어를 추가하면 더 나은 방법이 될 것입니다. 항상 데이터베이스가 여러 스테이징 환경에서 같은 이름을 가지고 그렇지 않다. 그들은 등 PROD, UAT, SIT, QA와 같은 포스트 픽스에 의해 구성 될 수 있습니다. 그래서 하드 코딩 된 쿼리를 인식하고 그들에게 더 역동적를합니다.
동일한 서버에 데이터베이스 사이의 연결 테이블을 사용하여 동의어 : # 1에 접근.
각 데이터베이스에서 별도로 수집 된 데이터 및 코드에 가입 : # 2에 접근. 데이터베이스 연결 문자열은 데이터베이스 또는 설정 파일 중 하나를 통해 응용 프로그램 서버 구성의 일부가 될 수 있습니다.
-
==============================
8.나는 다음이 코드를 시도하고 잘 작동 것
나는 다음이 코드를 시도하고 잘 작동 것
SELECT TimeTrackEmployee.StaffID FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
-
==============================
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.이를 위해 단순히 쿼리 아래의 사항을 지켜
이를 위해 단순히 쿼리 아래의 사항을 지켜
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.나는 문제가 두 테이블을 조인 가지는 동안, 나는 멀리 나는 두 가지를 동시에 원격 데이터베이스를 열어 원하는 정확히 어떤 일에 얻었다. 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을하고
그것은 나를 위해 일한, 나는 그것이 도움이되기를 바랍니다 ... 건배
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
'SQL' 카테고리의 다른 글
[SQL] ORDER BY와 LIMIT 대 MIN / MAX (0) | 2020.03.20 |
---|---|
[SQL] 삽입 명령을 실행하고 SQL에서 이드 삽입 돌려주는 (0) | 2020.03.20 |
[SQL] NOLOCK (SQL 서버 힌트) 나쁜 관행인가? (0) | 2020.03.20 |
[SQL] 날짜 + 시간과 날짜를 얻기 위해 SQL Server의 가장 효율적인 방법은? (0) | 2020.03.20 |
[SQL] 다른 주문 BY와 PostgreSQL을 DISTINCT ON (0) | 2020.03.20 |