Запросить две таблицы из разных схем

У меня есть две разные схемы в Oracle (скажем, S1, S2) и две таблицы в этих схемах (скажем, S1.Table1, S2.Table2). Я хочу запросить эти две таблицы из схемы S1.

Оба S1 и S2 находятся в разных базах данных. Из DB1 - Схема S1, я хочу сделать что-то вроде этого,

select T1.Id
  from S1.Table1 T1
     , S2.Table2 T2 
 Where T1.Id = T2.refId

Я знаю, что одним из способов сделать это было бы создать ссылку на БД для второй схемы и использовать ее в запросе. К сожалению, у меня нет привилегий, необходимых для создания ссылки на БД. Есть ли способ сделать это без ссылки на БД? Например, в TOAD вы можете сравнить два объекта схемы. Но опять же, два объекта схемы и это общее сравнение.

Любые идеи, предложения приветствуются. Спасибо заранее.

Ответ 1

Ссылки на БД - это в значительной степени название игры здесь. Если вы не можете создать созданную самостоятельно, проверьте, есть ли какие-либо общедоступные ссылки БД, которые вы могли бы использовать.

Также возможно, что ваши администраторы баз данных захотят иметь одну из своих связей БД, используемую для создания материализованного представления S2.Table2 в экземпляре S1.

Другим вариантом могут быть веб-службы, но я предполагаю, что вы столкнулись бы с гораздо более сложными административными проблемами, чем с простой ссылкой на БД. Учитывайте это только в том случае, если для ссылок нет веских причин (например, две отдельные организации, которые не хотят открывать межсетевые экраны между своими базами данных).

В противном случае вы попадаете в действительно уродливую территорию, но вы можете заставить что-то работать. Например:

  • Откройте как инструмент, который может читать сразу из нескольких подключений, и выполните соединение. Доступ. Жаба для анализа данных, что угодно.
  • Используйте инструмент Toad для копирования S2.Table2 в свою собственную схему ( "создайте в другой схеме", а затем "скопируйте данные в другую схему" )
  • Если у вас есть или могут получить дополнительные объекты каталога, определенные на обоих серверах, создайте материализованный вид S2 в качестве внешней таблицы в каталоге, который может быть записан с S2 и считан с S1.

Однако вы действительно не хотите поддерживать какое-либо из этих решений в долгосрочной перспективе.

Ответ 2

Вам не нужна ссылка на базу данных, если две схемы находятся в одной базе данных.

Ваш запрос должен работать из схемы S1, если S1 получил привилегию SELECT на S2.table2 (из учетной записи dba или из схемы S2: GRANT SELECT ON S2.Table2 TO S1).

Ответ 3

Используйте оператор CREATE DATABASE LINK для создания ссылки на базу данных. Ссылка базы данных является объектом схемы в одной базе данных, которая позволяет вам обращаться к объектам в другой базе данных.

немного не по теме, но вы можете использовать новый синтаксис соединения:

SELECT
    T1.Id
    FROM S1.Table1            T1
        INNER JOIN S2.Table2  T2 ON T1.Id = T2.refId

Все условия соединения отображаются в предложении "ON", и условия фильтрации отображаются в "WHERE".

Этот новый стиль упрощает чтение и понимание LEFT/RIGHT. Кроме того, я не знаком с Oracle (прошло много лет с тех пор, как я работал над ним), но с SQL Server я видел проблемы, когда старый стиль соединения и новый стиль объединения смешивались вместе в запросе с использованием представлений.

Ответ 4

Вы можете создать Java файл, который подключается к другой базе данных, и выполняет выбор в другой базе данных через JDBC. Java-хранимая процедура должна возвращать коллекцию. Вы можете присоединиться к этой коллекции с помощью select from table(...) с таблицей в вашей собственной базе данных.

См. здесь для примерно аналогичного решения.

Я думаю, что этот подход будет медленным и сложным, потому что вам нужно много кодировать, и вам нужно создать оболочку pl/sql для вашей Java-хранимой процедуры.

Лучше создать ссылку на базу данных.

Ответ 5

Вы не указываете, нужна ли эта функция как часть производственного кода, или если вы пытаетесь присоединиться к двум таблицам для выполнения некоторого разового анализа. Если это последнее, вы можете использовать Microsoft Access для создания локального файла mdb, который содержит связанные таблицы, в две базы данных, а затем написать запрос локального доступа, который ссылается на эти две таблицы. Затем вы можете использовать этот mdb в качестве источника данных для различных инструментов отчетности.

Запросы могут не использовать индексы так же эффективно, как родная ссылка Oracle db, но это было бы лучше, чем ничего.

edit: Nevermind - я вижу, что это уже было предложено выше.