【问题标题】:Query two tables from different schema从不同的模式查询两个表
【发布时间】:2009-06-11 11:38:05
【问题描述】:

我在 Oracle 中有两个不同的模式(比如 S1、S2)和这些模式中的两个表(比如 S1.Table1、S2.Table2)。我想从模式 S1 中查询这两个表。

S1 和 S2 都在不同的数据库中。从 DB1 - Schema S1,我想做这样的事情,

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

我知道这样做的一种方法是为第二个模式创建一个数据库链接并在查询中使用它。可悲的是,我没有创建数据库链接所需的权限。有没有办法在没有数据库链接的情况下做到这一点?例如,在 TOAD 中,您可以比较两个模式对象。但同样,两个模式对象也是一般比较。

非常感谢任何想法和建议。提前致谢。

【问题讨论】:

  • 访问您的 DBA 以获取权限!
  • 好建议。看来,只有拜访他并获得特权似乎是可行的。

标签: database oracle


【解决方案1】:

如果两个模式在同一个数据库中,则不需要数据库链接。

如果 S1 已被授予对 S2.table2 的 SELECT 权限(来自 dba 帐户或来自 S2 架构:GRANT SELECT ON S2.Table2 TO S1),您的查询应该可以从架构 S1 运行。

【讨论】:

  • 谢谢,我知道。这些模式位于不同的数据库中。
【解决方案2】:

DB Links 几乎就是这里的游戏名称。如果您无法自己创建一个,请检查是否有任何您可以使用的公共数据库链接。

您的 DBA 也可能愿意让他们的一个 DB 链接用于在 S1 实例上创建 S2.Table2 的物化视图。

另一个选项可能是 Web 服务,但我猜你会遇到比使用简单的 DB 链接更多的管理问题。只有在没有链接的充分理由时才考虑这些(例如:两个独立的组织不想在其数据库之间打开防火墙漏洞)。

如果做不到这些,您将进入非常丑陋的领域,但您也许可以使某些事情发挥作用。例如:

  • 从可以同时读取多个连接的工具打开两者并在那里进行连接。使用权。用于数据分析的 Toad,等等。
  • 使用 Toad 等工具将 S2.Table2 复制到您自己的架构(“在另一个架构中创建”,然后是“将数据复制到另一个架构”)
  • 如果您拥有或可以获得在两台服务器上定义的互补目录对象,请创建 S2 的实体化视图作为目录中的外部表,该目录可从 S2 写入并从 S1 读取。

不过,您确实不想长期维护这些解决方案中的任何一个。

【讨论】:

  • 嘿.. 非常感谢。为此+1。我仍然不愿将其标记为答案,希望能得到更多建议。
  • 感谢您的提示。删除自定义对象变得更加容易。
【解决方案3】:

使用 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 时,当使用视图在查询中混合使用旧的连接样式和新的连接样式时,我发现了一些问题.

【讨论】:

  • 感谢 KM。但遗憾的是,我没有创建 DB 链接的权限,并且可能无法获得 DBA 的帮助。认为应该有一些方法可以做。 :(
  • dba 怎么能不帮忙,他们应该在那里帮助您的项目工作?
  • 这是一次性活动。我想我会在去 DBA 之前四处寻找可能性。我知道,我总是可以在 DBA 的帮助下做到这一点。谢谢KM。
【解决方案4】:

您没有指定是否需要将此功能作为生产代码的一部分,或者您是否尝试连接两个表以执行一些一次性分析。如果是后者,您可以使用 Microsoft Access 创建一个本地 mdb 文件,其中包含指向这两个数据库的链接表,然后编写一个引用这两个表的本地 Access 查询。然后,您可以将该 mdb 用作各种报告工具的数据源。

查询使用索引的效率可能不如原生 Oracle 数据库链接,但总比没有好。

编辑:没关系 - 我看到上面已经建议了。

【讨论】:

  • 谢谢史蒂夫。我确实在查看您建议的内容。这是一次活动。 :)
【解决方案5】:

您可以创建一个 java 存储过程来连接到另一个数据库并通过 JDBC 在另一个数据库上执行一个选择。 java存储过程必须返回一个集合。您可以通过select from table(...) 与您自己数据库中的表一起加入此集合。

请参阅here 以获得大致相似的解决方案。

我认为这种方法既慢又复杂,因为您必须进行大量编码,并且必须为您的 java 存储过程创建一个 pl/sql 包装器。

最好创建一个数据库链接。

【讨论】:

  • 感谢 Tuinstoel。我对 Java 不是很熟悉。我将按照下面史蒂夫建议的方式进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多