【问题标题】:Join Two Databases in Oracle SQL在 Oracle SQL 中连接两个数据库
【发布时间】:2020-07-16 13:26:54
【问题描述】:

我需要你的帮助。我有两个数据库(例如 PEN 和 PAPER),其中的表需要连接。 db PEN 中的表名是 PEN.ORDER。 db PAPER 中的表名是 PAPER.ORDER。

我正在使用 PAPER db

SELECT SUPPLIER_NAME 
  FROM PAPER.ORDER AS A
 INNER JOIN PEN.PEN.ORDER AS B 
    ON A.SUPPLIER_ID=B.SUPPLIER_ID

它看不到 PEN 数据库中的表。尝试写 PEN."PEN.ORDERS" 和 PEN.[PEN.ORDERS] 但没有任何帮助。

但是当我用不同的数据库尝试类似的事情时,表名不包含点,它工作得很好。在 PAPER db 中就像:

SELECT SUPPLIER_NUMBER 
  FROM PAPER.ORDER AS A 
 INNER JOIN BOOK.ORDERS AS B 
    ON A.SUPPLIER_NUMBER=B.SUPPLIER_NUMBER

这里它起作用了,因为 BOOK db 中的表名只是 ORDERS,没有任何用点分隔的第二个单词。

【问题讨论】:

  • 您收到错误消息吗?你应该这样做,因为这不是 Oracle 的有效语法。
  • 您确定您使用的是 Oracle 意义上的“数据库”吗? Oracle 中的pen.order 指的是pen 模式中的order 表,paper.order 指的是paper 模式中的order 表。两种模式都在同一个数据库中,只是模式不同。如果您的意思是它们位于不同的数据库中,则需要两个数据库之间的数据库链接。
  • 但是当我用不同的数据库尝试类似的事情时,表名不包含点,它工作得很好。在 PAPER db 中就像:从 PAPER.ORDER 中选择 SUPPLIER_NUMBER 作为 A.SUPPLIER_NUMBER=B.SUPPLIER_NUMBER 上的 A INNER JOIN BOOK.ORDERS AS B 在这种情况下,我没有任何问题。 BOOK 是一个不同的数据库,我连接到它,表名只是 ORDERS。
  • 您似乎仍然不了解“数据库”和“模式”之间的区别。在 oracle 中,表名不也不能包含点。在我看来,您正在对 Oracle 进行 MS SQL Server 理解。那是行不通的。 “数据库”的定义是不同的。在 mssql 中通常称为“数据库”的是 Oracle 中的“模式”(用户拥有的对象的集合)。请重新阅读@Justin Cave 之前的评论
  • PL/SQL 不是 Oracle 数据库或 Oracle SQL 的名称。我什至不会对它是什么 感到厌烦——只是不要使用该名称来指代Oracle SQL。我会相应地编辑你的帖子。

标签: sql oracle join inner-join multiple-databases


【解决方案1】:

如果您的表在模式 PEN 中命名为 PEN.ORDER,则将其括在双引号中,如下所示。另外,从表 Alias 中删除 AS

     SELECT A.SUPPLIER_NAME 
     FROM PAPER.ORDER  A
     INNER JOIN PEN."PEN.ORDER" B 
     ON A.SUPPLIER_ID=B.SUPPLIER_ID

【讨论】:

    【解决方案2】:

    您所说的“数据库”是 Oracle 中的“用户”。

    您说当您以PAPER 连接时这不起作用:

    SELECT SUPPLIER_NAME 
      FROM PAPER.ORDER AS A
     INNER JOIN PEN.PEN.ORDER AS B 
        ON A.SUPPLIER_ID=B.SUPPLIER_ID
    

    db PEN 中的表名是 PEN.ORDER。 db PAPER 中的表名是 PAPER.ORDER。

    如果您希望能够获取属于其他用户的数据(在这种情况下为PEN),表所有者必须(至少)授予您对其表的SELECT 权限。所以:以PEN 连接并运行

    grant select on order to paper;
    

    然后再次以PAPER 连接并运行

    select a.supplier_name
    from order a join pen.order b on a.supplier_id = b.supplier_id;
    

    请注意我所做的一些更改:

    • 表的别名没有as关键字(不是order as a而是order a
    • PEN 的表前面有它的所有者名称,只有一次(不是pen.pen.order,而是pen.order

    然而:你的桌子有点奇怪。 order 是 Oracle 中的无效名称:

    SQL> create table order (id number);
    create table order (id number)
                 *
    ERROR at line 1:
    ORA-00903: invalid table name
    

    如果它真的使用了那个名字,那么它是用双引号创建的,例如

    SQL> create table "order" (id number);
    
    Table created.
    

    但是,你不能从中选择就这样

    SQL> select * From order;
    select * From order
                  *
    ERROR at line 1:
    ORA-00903: invalid table name
    

    不 - 你必须使用双引号,总是,匹配字母大小写,总是:

    SQL> select * From "order";
    
    no rows selected
    

    建议:不要使用保留/关键字作为对象名称。永远不要在 Oracle 中使用双引号(并不是说它不起作用 - 如您所见,它会起作用,但它真的很痛苦)。

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2017-09-09
      • 2016-11-03
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2021-03-21
      • 2022-07-26
      • 1970-01-01
      相关资源
      最近更新 更多