【问题标题】:How to join tables with same name in different schemas如何在不同的模式中连接同名的表
【发布时间】:2019-07-10 10:34:58
【问题描述】:

我需要检查两个同名但架构不同的表中的数据之间的差异。我有两个模式: Database1 和 Database2 ,在第一个模式中我有 TABLE_TEST 并且在第二个模式中 TABLE_TEST 也是。表中的数据彼此之间存在一些差异。我需要找出那些差异。我试过的是上面的查询,但它抛出了这个错误

ORA-00942: 表或视图不存在
00942. 00000 - “表或视图不存在”

SELECT *
FROM Database1.TABLE_TEST 
  INNER JOIN Database2.TABLE_TEST 
          ON Database1.TABLE_TEST.ID = Database2.TABLE_TEST.ID;

表格的外观以及我需要显示的差异

【问题讨论】:

  • 你有两个模式还是两个数据库?这是两个非常不同的事情。如果这些确实是模式 (=users),那么您用于运行查询的 oracle 用户需要对所有表具有选择权限 - 包括不属于该帐户的表。
  • 两个模式,不要介意名字:)
  • 在您的示例 2 和 4 中,内部联接不会找到具有不同 id 的行。如果您想查看它们,您需要 full join。并使用别名使语法更具可读性。

标签: sql oracle


【解决方案1】:

假设您以DATABASE1 用户的身份连接。

DATABASE2用户必须

grant select on table_test to database1;

以便database1 可以选择其数据。

然后,您编写的查询应该可以正常工作(database1 前缀不是必需的,但不会造成任何伤害)。

SELECT *
FROM Database1.TABLE_TEST 
  INNER JOIN Database2.TABLE_TEST 
          ON Database1.TABLE_TEST.ID = Database2.TABLE_TEST.ID;

【讨论】:

  • 如果我在数据库 2 中尝试此操作:将 table_test 上的选择授予数据库 1;出现此错误“用户或角色 '%s' 不存在”。我将其更改为:将 TABLE_TEST 上的选择授予 userDb1;出现了database1的用户名和Grant succeeded。但是,当我编译之前编写的查询时,问题再次在于了解 Database2.TABLE_TEST。抛出此异常:00942. 00000 - “表或视图不存在”
  • 如果你做对了,这种方法是有效的。我只知道你告诉我们的。如果您使用通用名称,请不要指望我们会读懂您的想法。我没有水晶球。请编辑初始消息并复制/粘贴您的 SQL Plus 会话,以便我们可以看到您到底做了什么以及 Oracle 是如何响应的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2016-03-29
相关资源
最近更新 更多