Запросить две таблицы из другой схемы - PullRequest
10 голосов
/ 11 июня 2009

У меня есть две разные схемы в 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 вы можете сравнить два объекта схемы. Но опять же два объекта схемы и это общее сравнение.

Любые идеи, предложения с благодарностью. Заранее спасибо.

Ответы [ 5 ]

16 голосов
/ 11 июня 2009

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

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

8 голосов
/ 11 июня 2009

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

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

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

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

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

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

1 голос
/ 11 июня 2009

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

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

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

1 голос
/ 11 июня 2009

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

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

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

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

1 голос
/ 11 июня 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...