次のようなクエリがあるとしましょう。
SELECT Oracle.Column1, SqlServer.Column1
FROM SqlServer
INNER JOIN Oracle
on SqlServer.ID = Oracle.ID
Cx_Oracleとpyodbcを使用して、Pythonでそれぞれのデータベースへのカーソル接続を確立しました。個々のクエリはうまく機能します。私ができるサブクエリ。しかし、OracleとSQLServerの両方への接続を必要とする内部結合を使用したこのクエリは失われます。これを分割したり、プログラムでアプローチしたりするにはどうすればよいですか?
私の現在のバージョンでは一時テーブルを作成していますが、これはSQL Serverでのみ機能し、Oracleでは機能しません。目標は、カーソルを使用してそれぞれのサーバーに接続することです(現在は達成できます)が、それではどうしますか?
単純に、ローカルテーブルであるかのようにリモートデータベース間でクエリを実行することはできません。データベース接続の各カーソル内で、そのユニバースは、指定した接続サーバー、スキーマ、またはカタログ/データベースに制限されます。それらのオブジェクト(テーブル、関数/プロシージャなど)のみが使用可能です。それ以上のものは認識されません。
そうは言っても、今日のほとんどのリレーショナルデータベースは、Oracleのデータベースリンク、SQL Serverのリンクサーバー、DB2のカタログ、Postgresの外部データラッパー、MySQLのフェデレーションストレージエンジン、MS Accessのリンクテーブル、SQLiteのATTACH(ただし他のSQLiteのみ)を含む外部サーバー接続をサポートしています。データベース)。
したがって、OracleまたはSQL Serverのいずれかでリモート接続を確立することを検討し、接続しているユーザーにアクセスが許可されている場合は、必要なJOIN
クエリを実行します。以下は、接続とクエリの非常に簡単な例です。適切な接続パラメータについて調査を行ってください。また、Oracleスキーマ(ユーザーのみ)はSQL Serverスキーマ(オブジェクトの名前空間コンテナー)とは異なることを忘れないでください。
オラクル
データベースリンクは、クライアントが1つの論理データベースとしてそれらにアクセスできるようにする2つの物理データベースサーバー間の接続です。
CREATE PUBLIC DATABASE LINK ... USING 'mssql_db'; -- TO BE RUN ONCE
SELECT o.Column1, s.Column1
FROM oracle_local_table o
INNER JOIN mssql_db.sql_server_remote_table s
ON s.ID = o.ID
SQLサーバー
リンクサーバーを使用すると、OLEDBデータソースに対する分散型の異種クエリにアクセスできます。リンクサーバーが作成された後、このサーバーに対して分散クエリを実行でき、クエリは複数のデータソースからのテーブルを結合できます。
EXEC master.dbo.sp_addlinkedserver -- TO BE RUN ONCE
@server = N'oracle_server',
@srvproduct=N'...',
@provider=N'...',
@provstr=N'...'
SELECT o.Column1, s.Column1
FROM oracle_server..user.oracle_remote_table o
INNER JOIN sql_server_local_table s
ON s.ID = o.ID
-- ALTERNATIVELY
SELECT o.Column1, s.Column1
FROM OPENQUERY (oracle_server, 'SELECT * FROM scott.oracle_remote_table') o
INNER JOIN sql_server_local_table s
ON s.ID = o.ID
上記の場合のPythonの代替手段は、難しすぎるか、高レベルの特権権限が必要です。
いずれかの側に一時テーブルを作成し、cursor.fetch
およびcursor.execute
またはcursor.executemany
を介してリモートテーブルレコードをダンプしてから、JOIN
ローカルでクエリを実行します。
両方のテーブルをSQLiteデータベース(ディスクまたはメモリ内インスタンス)にインポートし、JOIN
クエリを実行します。注:Python 3では、sqlite3
は標準ライブラリの一部であるため、Pythonインストールに付属しています。
Pythonのサードパーティモジュールであるpandasを使用して、両方のテーブルをデータフレームにインポートし、実行しますmerge
(SQLのカウンターパートJOIN
)。sqlalchemyとのインターフェースにより、パンダはを使用してデータベースへの1回の呼び出しでデータフレームをダンプすることもできますto_sql
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加