У меня есть две разные схемы в 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 - я вижу, что это уже было предложено выше.