2017-06-22 11 views
3

私はdplyr (0.7.0),dbplyr (1.0.0),DBI 0.6-1およびodbc (1.0.1.9000)を使用しています。Rとdplyrを使用して、異なるSQLデータベースからテーブルを結合する方法は?

db1 <- DBI::dbConnect(
    odbc::odbc(), 
    Driver = "SQL Server", 
    Server = "MyServer", 
    Database = "DB1" 
) 
db2 <- DBI::dbConnect(
    odbc::odbc(), 
    Driver = "SQL Server", 
    Server = "MyServer", 
    Database = "DB2" 
) 
x <- tbl(db1, "Table1") %>% 
    dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn") 

が、私は実際にそれに任意の物質を持っていないようだエラーを取得しておいてください。私は、次のような何かをしたいと思います。 show_queryを使用すると、コードが別のデータベースを考慮に入れずに2つのテーブルを結合するSQLクエリを作成しようとしているようです。

x <- tbl(db1, "Table1") %>% 
     dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn", copy = TRUE) 

をしかし出力またはエラーメッセージの変更はありません。dplyr::left_joinのドキュメントごとに、私も試してみました。同じサーバー上の別々のデータベースからテーブルを結合する別の方法はありますか?

+1

'dbplyr :: collect()'を使用して、各データベースからデータを強制的に取り込み、ローカルRインスタンスで結合することができます。これは、データを過度にプルしないために、 'collect()'コールの前にフィルタリングと基本選択を行うべきであることを示唆しています。 – r2evans

+1

私のバックアップ計画では、両方のデータセットをプルインし、Rでローカルに結合します。問題は、データセットが非常に大きく、別のデータベースの列を使用して結果をフィルタリングしたい場合ですデータはローカルに格納されます。 –

+0

正直言って、このようなマルチDBMSの結合/フィルタリングは、(foreign keyを持つネイティブSQL以外の)どの言語でも難しいです。各テーブルから代表的なサンプルデータを提供する場合(つまり、最小限ではあるが十分な変動性を表す場合)、私たちは助けてくれるかもしれませんが、少なくとも1つのDBMSから多くのデータを取得しようとしていると思います。 – r2evans

答えて

0

merge()関数を使用して、テーブルの左結合を実行します。それは​​のようなものでしょう。

+2

'merge()'が 'dbplyr'とデータベース接続を' left_join() 'のような' dplyr'関数と同じように動作するとは思わないです。 –

0

私は同じ問題に直面し、私はdplyr :: left_joinで解決できませんでした。

少なくとも、次の回避策を使用して作業を実行できました。 デフォルトのデータベースを宣言せずにSQL Serverに接続した後、sql()でクエリを実行しました。 data_db%>%

con <- dbConnect(odbc::odbc(), dsn="DWH" , uid="", pwd= "") 

data_db <- tbl(con, sql("SELECT * 
        FROM DB1..Table1 AS a 
        LEFT JOIN DB2..Table2 AS b ON a.JoinColumn = b.JoinColumn")) 

...

はそれがお役に立てば幸いです。

関連する問題