查询来自不同模式的两个表

时间:2009-06-11 11:38:05

标签: database oracle

我在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

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

任何想法,建议都非常感谢。提前谢谢。

5 个答案:

答案 0 :(得分:16)

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

您的查询应该从模式S1开始工作,前提是S1已被授予S2.table2的SELECT权限(来自dba帐户或来自S2模式:GRANT SELECT ON S2.Table2 TO S1)。

答案 1 :(得分:8)

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

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

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

如果失败了,你会进入一个非常丑陋的领域,但你可能会有所作为。例如:

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

但你真的不想长期维持这些解决方案。

答案 2 :(得分:1)

使用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,我在使用视图的查询中将旧的连接样式和新的连接样式混合在一起时遇到了问题

答案 3 :(得分:1)

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

有关大致相似的解决方案,请参阅here

我认为这种方法既慢又复杂,因为你必须做很多编码,你必须为你的java存储过程创建一个pl / sql包装器。

最好创建数据库链接。

答案 4 :(得分:1)

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

查询可能不像本机Oracle数据库链接那样有效地使用索引,但它总比没有好。

编辑:没关系 - 我发现上面已经提到了这一点。