Farklı sunucularda iki veritabanındaki iki tabloyu birleştirerek verileri sorgulama


Yanıtlar:


86

sp_addlinkedserverBir sunucu bağlantısı oluşturmak için kullanmanız gerekecek . Kullanım için referans belgelerine bakın . Sunucu bağlantısı kurulduktan sonra, sorguyu normal bir şekilde oluşturacak, sadece veritabanı adını diğer sunucunun önüne koyacaksınız. IE:

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

Bağlantı kurulduktan sonra, OPENQUERYuzak sunucuda bir SQL ifadesi yürütmek ve yalnızca verileri size geri aktarmak için de kullanabilirsiniz. Bu biraz daha hızlı olabilir ve uzak sunucunun sorgunuzu optimize etmesine izin verir. Verileri DB1yukarıdaki örnekte geçici (veya bellek içi) bir tabloda önbelleğe alırsanız , standart bir tabloya katılır gibi sorgulayabilirsiniz. Örneğin:

-- 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

Check out OPENQUERY belgelerine biraz daha örnekleri görmek için. Yukarıdaki örnek oldukça uydurma. Bu özel örnekte kesinlikle ilk yöntemi kullanırdım, ancak OPENQUERYbazı verileri filtrelemek için sorguyu kullanırsanız, ikinci seçeneği kullanmak biraz zaman ve performans tasarrufu sağlayabilir.


1
php-mysql ile mümkün mü .. evet ise, lütfen bana bu seçenekle nasıl büyüyebilirim?
Jhanvi

1
MySQL'in bağlantılı sunucuları destekleyip desteklemediğini bilmiyorum. Bu cevap Microsoft SQL sunucusuna özeldir.
Scott Anderson

3
PostgreSQL cevabı arayan biri varsa şunu deneyin: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland

7

Bunu dene:

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

Bağlı bir sunucuya dba'nız tarafından izin verilmiyorsa, OPENROWSET'i kullanabilirsiniz. Books Online, ihtiyacınız olan sözdizimini sağlayacaktır.


4

Pratik bir kurumsal perspektiften bakıldığında, en iyi uygulama, veritabanınızdaki veritabanı tablosunun aynalanmış bir kopyasını oluşturmak ve ardından bunu her saat bir delta ile bir task / proc güncellemesidir.


1

İki tablonun birleştirilmesi en iyi şekilde bir DBMS tarafından yapılır, bu nedenle bu şekilde yapılmalıdır. Daha küçük tabloyu veya bunun alt kümesini veritabanlarından birine yansıtabilir ve sonra onlara birleştirebilirsiniz. Bunu informatica gibi bir ETL sunucusunda yapmak cazip gelebilir, ancak tabloların çok büyük olması tavsiye edilmez sanırım.


1

Veritabanı bağlantı seçeneği mevcut değilse, izleyebileceğiniz başka bir yol, tabloları ODBC aracılığıyla MS Access veya Crystal raporları gibi bir şeye bağlamak ve orada birleştirme yapmaktır.


0

Belki de sabit kodlanmış veritabanı adları bir SQL sorgusu içinde her zaman en iyi yaklaşım değildir. Bu nedenle, eş anlamlılar eklemek daha iyi bir yaklaşım olacaktır. Veritabanlarının birkaç hazırlık ortamında aynı ada sahip olması her zaman geçerli değildir. PROD, UAT, SIT, QA vb. Gibi postfixlerden oluşabilir. Bu nedenle, sabit kodlanmış sorgulara dikkat edin ve onları daha dinamik hale getirin.

Yaklaşım # 1: Aynı sunucudaki veritabanları arasında tabloları birbirine bağlamak için eş anlamlıları kullanın.

Yaklaşım 2: Verileri her veritabanından ayrı ayrı toplayın ve kodunuzda birleştirin. Veritabanı bağlantı dizeleriniz, bir veritabanı veya bir yapılandırma dosyası aracılığıyla Uygulama sunucusu yapılandırmanızın bir parçası olabilir.


-2

Aşağıdaki kodu denedim ve iyi çalışıyor

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

Yanıtlar genel olmalıdır, yalnızca kullanım senaryolarınızın kopyalanıp yapıştırılması değil. Ayrıca bu, soruyu soran kullanıcıya yardımcı olmaz.
Wladimir Gramacho

-2

Aşağıdakileri deneyebilirsiniz:

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

bunun için aşağıdaki sorguyu takip etmeniz yeterlidir

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

Veritabanının adını yazdığım yerde, veritabanının adını tanımlamanız gerekir. Aynı veritabanındaysanız, bu nedenle veritabanı adını tanımlamanız gerekmez, ancak başka bir veritabanındaysanız, veritabanı adını yol olarak belirtmeniz gerekir, aksi takdirde hata gösterilir. Umarım işini kolaylaştırmışımdır


-2

Bu iki masaya katılmakta zorlanırken, her iki uzak veritabanını aynı anda açarak tam olarak istediğimi yapmaktan kurtuldum. MySQL 5.6 (php 7.1) ve diğer 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>";
}

Ekranda bu iki Tamam'ı görürseniz, her iki veritabanı da açık ve hazırdır. Daha sonra sorgularınızı yapmaya devam edebilirsiniz.

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

Bazı birleştirmeler yapmaya çalışıyordum, ancak bu iki DB'yi açtığım için, yalnızca bağlantıyı değiştirerek ileri geri sorgulama yapabilirim $mysqli1veya$mysqli2

Benim için çalıştı, umarım yardımcı olur ... Şerefe


Sanırım kimse php kullanmamamı söylemedi ... Aynı sorunu yaşadım ve bazı programlama ile
çözebildim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.