Просто вы не можете выполнить запрос к удаленным базам данных, как если бы они были локальными таблицами. Внутри каждого курсора соединения с базой данных его юниверс ограничивается указанным вами сервером, схемой или каталогом / базой данных. Доступны только те объекты (таблицы, функции / процедуры и т. Д.). Ничто за пределами не распознается.
С учетом вышесказанного большинство реляционных баз данных сегодня поддерживают соединения с внешними серверами, включая Oracle Database Links , SQL Server Linked Servers , DB2 Каталог , Postgres ' Оболочки сторонних данных , MySQL Объединенный механизм хранения , MS Access' Связанные таблицы , SQLite ATTACH (нотолько другие базы данных SQLite).
Поэтому рассмотрите возможность установки удаленного соединения в Oracle или SQL Server, а затем, если подключающемуся пользователю разрешен доступ, выполните необходимый запрос JOIN
. Ниже приведены очень простые примеры подключения и запросов. Сделайте свое исследование для соответствующих параметров подключения. Кроме того, помните, что схема Oracle (только пользователь) отличается от схемы SQL Server (контейнера пространства имен объектов).
Oracle
База данныхссылка - это соединение между двумя физическими серверами баз данных, которое позволяет клиенту обращаться к ним как к одной логической базе данных.
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 Server
Связанный сервер обеспечивает доступ к распределенным гетерогенным запросам к источникам данных OLE DB. После создания связанного сервера к этому серверу можно запускать распределенные запросы, и запросы могут объединять таблицы из более чем одного источника данных.
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 , pandas может даже выгружать кадры данных за один вызов базы данных, используя to_sql
.