서로 다른 서버의 두 데이터베이스에있는 두 테이블을 결합하여 데이터 쿼리
서로 다른 서버에있는 두 개의 서로 다른 데이터베이스에 두 개의 테이블이 있습니다. 몇 가지 쿼리를 만들기 위해 조인해야합니다. 어떤 옵션이 있습니까? 어떻게해야합니까?
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
'code' 카테고리의 다른 글
AngularJS를 명시 적으로 지원하는 IDE가 있습니까? (0) | 2020.09.08 |
---|---|
C #에서 식 트리 직렬화 및 역 직렬화 (0) | 2020.09.08 |
Chrome Dev Tool에 날짜 __proto__가 잘못된 날짜로 표시되는 이유는 무엇입니까? (0) | 2020.09.08 |
Gmail 용 HTML 이메일 스타일링 (0) | 2020.09.08 |
이것이 C ++ 11 for 루프의 알려진 함정입니까? (0) | 2020.09.08 |